我有以下LINQ to Entities表达式:
var allItemsOver64 =
_inventoryContext.Items.Where(
i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65);
问题在于,当我使用allItemsOver64时,它表示不支持此表达式。我有一种感觉,因为调用了CalculateAgeInYears方法而发生了这个错误。为什么会发生这种情况?我该如何解决?
谢谢,
萨钦
编辑:
即使在更改代码以使用IEnumerables后,我仍然会得到相同的错误。这是我现在的代码:
DateTime now = DateTime.UtcNow;
var allItemsOver64 =
_inventoryContext.Items.Where(
i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65).AsEnumerable();
IEnumerable<Item> items65To69 = allItemsOver64.Where(
i =>
DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65 &&
DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) <= 69).AsEnumerable();
答案 0 :(得分:5)
您无法在EF查询中调用C#方法,因为EF不知道如何将该方法转换为SQL。
相反,请先调用.AsEnumerable()
强制Where()
在本地运行。
答案 1 :(得分:2)
因为Linq无法将您的帮助方法解释为SQL命令。您应该在db端实现这样的逻辑,或者选择所有值,然后在客户端进行检查。这对我来说都不是很好,这就是为什么我总是试图简化数据库,尽可能简单地进行查询。
答案 2 :(得分:2)
如果我从您的函数名称中正确推断出来,我认为这可能是您正在寻找的内容:
using System.Data.Objects.SqlClient;
var allItemsOver64 = _inventoryContext
.Items
.Where(i => (SqlFunctions
.DateDiff("dd", i.PrimaryInsured.DoB, now) / 365.0)
>= 65.0);