【问题标题】:Issue with Filtering Entity Framework data by Calculated Fields按计算字段过滤实体框架数据的问题
【发布时间】:2014-05-23 20:19:04
【问题描述】:

这是我的问题的简化 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(predicate) 方法,就像 LINQ 一样。它是这样使用的:

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

这很好用,并返回包含所有字段的预期对象,包括 CalculatedDate。 但是,当我尝试将计算字段用作谓词的一部分时,如下所示:

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

我收到一个错误:

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

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

【问题讨论】:

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


    【解决方案1】:

    Entity Framework 尝试将您的 LINQ 转换为 SQL,因此在尝试将您的 MyClass.CalculatedDate 方法转换为 SQL 中可识别的方法时遇到了麻烦。您可以通过在您的位置之前在您的 LINQ 中添加 .AsEnumerable() 调用来解决此问题,如下所示:

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

    【讨论】:

    • 查看 SQL 分析器,CalculatedDate 似乎不是查询的一部分。另外,在这种情况下,添加 AsEnumerable 也无济于事。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2017-11-08
      • 2016-11-07
      • 2013-01-13
      相关资源
      最近更新 更多