Linq表达不受支持

时间:2012-04-26 14:30:52

标签: c# linq entity-framework-4 linq-to-entities

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

3 个答案:

答案 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);