2

我有以下 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();
4

3 回答 3

5

您不能在 EF 查询中调用 C# 方法,因为 EF 不知道如何将方法转换为 SQL。

相反,.AsEnumerable()首先调用以强制在Where()本地运行。

于 2012-04-26T14:35:08.460 回答
2

因为 Linq 无法将您的辅助方法解释为 SQL 命令。您应该在数据库端实现这样的逻辑,或者选择所有值,然后才在客户端进行检查。这两个对我来说都不好看,这就是为什么我总是尝试简化数据库,尽可能地进行简单的查询。

于 2012-04-26T14:34:37.743 回答
2

如果我从您的函数名称中正确推断,我认为这可能是您正在寻找的:

using System.Data.Objects.SqlClient;

var allItemsOver64 = _inventoryContext
                     .Items
                     .Where(i => (SqlFunctions
                                  .DateDiff("dd", i.PrimaryInsured.DoB, now) / 365.0) 
                                  >= 65.0);
于 2012-04-26T14:45:56.743 回答