通过计算字段过滤实体框架数据的问题

本文关键字:框架 数据 问题 实体 过滤 计算 字段 | 更新日期: 2023-09-27 18:05:06

以下是我的问题的简化EF场景:

public partial class MyClass
{
    public int ID { get; set; }
    public byte Month { get; set; }
    public int Year { get; set; }
    public DateTime CalculatedDate
    {
        get
        {
            return new DateTime(this.Year, this.Month, 1);
        }
    }
}

我使用一个存储库模式来访问这些对象,它也实现了一个返回IEnumrable的Where(谓词)方法,就像LINQ一样。它是这样使用的:

var myClasses = myClassRepo.Where(mc=> mc.ID > 10);

这工作得很好,并返回所有字段的预期对象,包括CalculatedDate。然而,当我尝试使用计算字段作为谓词的一部分时,像这样:

var myClasses = myClassRepo.Where(mc=> mc.CalculatedDate == DateTime.Now);

I Receive an error:

对象引用未设置为对象的实例。

我知道我可以通过检索第一组结果来"遍历"它,然后通过计算字段进一步过滤它。但我正在努力理解为什么会发生这种情况,以及如何解决这个问题。

通过计算字段过滤实体框架数据的问题

实体框架试图转换你的LINQ到SQL,所以它有麻烦,试图转换你的MyClass。将CalculatedDate方法转换为SQL中可识别的内容。您可以通过在where之前在LINQ中添加.AsEnumerable()调用来解决这个问题,如下所示:

var myClasses = myClassRepo.AsEnumerable().Where(mc => mc.CalculatedDate == DateTime.Now);

我认为这是因为EF不支持查询自定义属性,因为它们不能转换为DB列