不支持 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();

不支持 Linq 表达式

不能在 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 命令。您应该在数据库端实现此类逻辑,或者选择所有值,然后才在客户端进行检查。这对我来说都不是很好,这就是为什么我总是试图简化数据库,尽可能简单的查询。