不支持 Linq 表达式
本文关键字:表达式 Linq 不支持 | 更新日期: 2023-09-27 18:32:24
我有以下 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();
不能在 EF 查询中调用 C# 方法,因为 EF 不知道如何将该方法转换为 SQL。
相反,请先调用.AsEnumerable()
以强制Where()
在本地运行。
如果我从您的函数名称中正确推断,我认为这可能是您正在寻找的:
using System.Data.Objects.SqlClient;
var allItemsOver64 = _inventoryContext
.Items
.Where(i => (SqlFunctions
.DateDiff("dd", i.PrimaryInsured.DoB, now) / 365.0)
>= 65.0);
因为 Linq 无法将帮助程序方法解释为 SQL 命令。您应该在数据库端实现此类逻辑,或者选择所有值,然后才在客户端进行检查。这对我来说都不是很好,这就是为什么我总是试图简化数据库,尽可能简单的查询。