gpt4 book ai didi

.net - LINQ 到实体 : Age calculation in a LINQ query causes "Method cannot be translated into a store expression"

转载 作者:行者123 更新时间:2023-12-02 07:06:53 24 4
gpt4 key购买 nike

使用 LINQ to Entities,我需要从年龄介于 AgesFrom 和 AgesTo 之间的 PersonTable 获取记录。问题是,我需要根据存储在数据库中的 DateOfBirth 和特定的 DateToCalculate 来计算他们的年龄。

例如。PersonTable:DateOfBirth=01/04/1972,DateToCalculateAge=25/12/2011

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

对于我提供的代码,我得到以下异常:“LINQ to Entities 无法识别‘System.DateTime AddYears(Int32)’方法,并且无法将此方法转换为存储表达式。”

我知道一旦 LINQ 将查询传递给数据库,我尝试使用的方法就无法翻译。有解决办法吗?我可以在访问数据库后进行过滤,但我想避免那种瓶颈。我也想过添加一个 sql 函数来为我做这个计算,但想先用尽 LINQ 的可能性。

这里有一篇不错的帖子详细介绍了如何在查询之前更好地进行年龄计算: Shortest way to check for age filter in LINQ?但是在我的情况下,我不是从 DateTime.Now 计算年龄,而是从数据库中的日期计算年龄。

最佳答案

由于您使用的是 LINQ to Entities,因此首选解决方案是使用 System.Data.Objects.EntityFunctions 中定义的方法。 (EF 版本 6 的更新:改用 DbFunctions)并且查询表面会成功地将它们转换为 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)
)
)

我不确定上面的内容是否真的正确,因为它真的伤害了我的眼睛。

关于.net - LINQ 到实体 : Age calculation in a LINQ query causes "Method cannot be translated into a store expression",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10601701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com