.net LINQ到实体:LINQ查询中的年龄计算原因“;方法无法转换为存储表达式;
使用LINQtoEntities,我需要从年龄介于AgesFrom和AgesTo之间的PersonTable中获取记录。问题是,我需要从出生日期和特定日期计算他们的年龄,这两个日期都存储在数据库中 例如。 联系人:出生日期=1972年4月1日,计算日期=2011年12月25日.net LINQ到实体:LINQ查询中的年龄计算原因“;方法无法转换为存储表达式;,.net,linq,linq-to-entities,.net,Linq,Linq To Entities,使用LINQtoEntities,我需要从年龄介于AgesFrom和AgesTo之间的PersonTable中获取记录。问题是,我需要从出生日期和特定日期计算他们的年龄,这两个日期都存储在数据库中 例如。 联系人:出生日期=1972年4月1日,计算日期=2011年12月25日 .Where(0 < o.FormDate.AddYears(-agesFrom).CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth)) &&
.Where(0 < o.FormDate.AddYears(-agesFrom).CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth)) &&
0 > o.FormDate.AddYears(-agesTo).CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth));
// ----------------------- OR ------------------------
.Where(agesFrom <= CalculateAge(o.Person.DateOfBirth.Value, o.FormDate) &&
agesTo >= CalculateAge(o.Person.DateOfBirth.Value, o.FormDate);
.Where(0o.FormDate.AddYears(-agesTo)。比较(o.FormDate.Subtract(o.Person.DateOfBirth));
//--------------------------或------------------------
其中(agesFrom=计算日期(o.Person.DateOfBirth.Value,o.FormDate);
对于我提供的代码,我得到以下异常:“LINQ to Entities无法识别方法'System.DateTime AddYears(Int32)'方法,并且此方法无法转换为存储表达式。”
我知道,一旦LINQ将查询传递给db,方法我正在尝试使用无法翻译的。是否有解决方法?我可以在访问数据库后进行筛选,但希望避免这种瓶颈。我还考虑添加一个sql函数来为我执行此计算,但希望首先耗尽LINQ的可能性
这里有一篇很好的帖子详细介绍了在查询之前如何更好地进行年龄计算:
但是在我的情况下,我不是从DateTime计算年龄。现在,而是从数据库中的某个日期计算年龄。由于您使用LINQ to实体,首选的解决方案是使用(更新EF版本6:改用中定义的方法)并且查询面将成功地将它们转换为SQL。在这种情况下,您希望采用以下示例:
o.FormDate.AddYears(-agesFrom)
.CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth))
把它转换成
EntityFunctions.DiffMinutes(
EntityFunctions.AddYears(o.FormDate, -agesFrom),
EntityFunctions.AddSeconds(
o.FormDate,
EntityFunctions.DiffSeconds(o.FormDate, o.Person.DateOfBirth)
)
)
我不确定上述内容是否正确,因为它确实伤害了我的眼睛。不能在LINQ to Entities中使用这些方法。但是,如果查询是在内存中完成的,可以。请尝试在
之前使用.ToList()
。其中:
.ToList().Where(0 < o.FormDate.AddYears(-agesFrom)
.CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth)) && 0 > o.FormDate.AddYears(-agesTo)
.CompareTo(o.FormDate.Subtract(o.Person.DateOfBirth));
.ToList().Where(0o.FormDate.AddYears(-agesTo)
.比较(o.FormDate.减去(o.Person.出生日期));
或
.ToList().Where(agesFrom=CalculateAge(o.Person.DateOfBirth.Value,o.FormDate);
这样,.ToList()
将把查询带到内存中,您将能够使用这些方法
如果你有一个巨大的数据库,它的性能会受到影响,但它会工作。我试图避免将其放入内存,因为可能会有……许多结果:)谢谢!这些EntityFunctions为我节省了很多时间和麻烦。EntityFunctions.AddYears现在已经过时了-建议的替代方案是:System.Data.Entity.DbFunctions.AddYears…它做同样的事情。EntityFunctions/DbFunctions在单元测试中不可测试
.ToList().Where(agesFrom <= CalculateAge(o.Person.DateOfBirth.Value, o.FormDate)
&& agesTo >= CalculateAge(o.Person.DateOfBirth.Value, o.FormDate);