通过计算字段过滤实体框架数据的问题
本文关键字:框架 数据 问题 实体 过滤 计算 字段 | 更新日期: 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列