Ark*_*nam 2 .net linq linq-to-entities
使用LINQ to Entities,我需要从PersonTable获取记录WHERE年龄介于AgesFrom和AgesTo之间.问题是,我需要从DateOfBirth和特定的DateToCalculate计算它们的Age,它们都存储在数据库中.
例如.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);
Run Code Online (Sandbox Code Playgroud)
对于我提供的代码,我得到以下异常:"LINQ to Entities无法识别方法'System.DateTime AddYears(Int32)'方法,并且此方法无法转换为商店表达式."
我理解一旦LINQ将Query传递给db,我尝试使用的方法就无法翻译.有没有解决这个问题?我可以在点击数据库后过滤,但想避免那种瓶颈.我还想过添加一个sql函数来为我做这个计算,但是想先耗尽LINQ的可能性.
这里有一篇不错的帖子详细介绍了如何在查询之前更好地进行年龄计算: 在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))
Run Code Online (Sandbox Code Playgroud)
并将其转换为类似的东西
EntityFunctions.DiffMinutes(
EntityFunctions.AddYears(o.FormDate, -agesFrom),
EntityFunctions.AddSeconds(
o.FormDate,
EntityFunctions.DiffSeconds(o.FormDate, o.Person.DateOfBirth)
)
)
Run Code Online (Sandbox Code Playgroud)
我不确定上面是否真的是正确的,因为它确实伤害了我的眼睛.