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

时间:2014-05-23 20:19:04

标签: c# linq entity-framework repository-pattern entity-framework-6

以下是我的问题的简化EF Scenerio:

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);

我收到错误:

  

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

我知道我可以通过检索第一组结果来“解决”这个问题,然后通过计算字段进一步过滤它。但我试图理解为什么会发生这种情况以及可以采取哪些措施来解决这个问题。

2 个答案:

答案 0 :(得分:0)

实体框架尝试将您的LINQ转换为SQL,因此尝试将MyClass.CalculatedDate方法转换为SQL中可识别的方法时会遇到问题。您可以通过在LINQ之前在LINQ中添加.AsEnumerable()调用来解决这个问题,如下所示:

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

答案 1 :(得分:0)

我认为这是因为EF不支持查询自定义属性,因为它们无法转换为数据库列