【问题标题】:Is there any way to get Linq-to-entities to evaluate a local expression有没有办法让 Linq-to-entities 评估本地表达式
【发布时间】:2011-02-22 17:13:54
【问题描述】:

假设您有以下 linq 表达式:

from o in salesEntities.Orders where o.OrderDate < DateTime.Today.AddDays(-20) select o

Entity Framework 不知道如何将 DateTime.Today.AddDays(-20) 转换为 Entity SQL 表达式,您会收到以下错误:

LINQ to Entities 无法识别方法 'System.DateTime AddDays(Double)' 方法,并且该方法无法转换为存储表达式。

所以这是我的问题:有什么方法可以让 Linq to Entities 评估 lambda 表达式的一部分并替换一个常量值,而无需我声明一个局部变量来保存它?

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    LINQ-to-Entities 可以处理本地值,但不能处理本地表达式。您的代码将适用于这个小改动:

    var pastDate = DateTime.Today.AddDays(-20);

    from o in salesEntities.Orders where o.OrderDate &lt; pastDate select o

    【讨论】:

    • 这是对的。如果您在查询中确实需要AddDays(这不是其中之一),请使用EntityFunctions 类型。
    • +1 指向 EntityFunctions 的指针...不知道这一点。方便!
    • 正如我在问题末尾所问的,这可以在没有局部变量的情况下完成吗?我刚刚编写了一个包含 8 个不同常量日期的查询,所以现在我的代码中有 8 个额外的局部变量。 应该有一种方法可以说只是执行这个位并在查询中传递结果。
    • @Darren,您可以使用 EntityFunctions 类型在没有本地的情况下执行此操作。
    • 对不起@Craig,我明白了,我想知道是否有某种方法可以让任何没有来自实体输入的 .NET 函数在翻译前进行本地评估。然后我可以写“where date > LastPublicHoliday(DateTime.Today)”或其他一些随机函数。我认为答案是否定的!
    【解决方案2】:

    使用 EntityFunction 更改您的表达式以添加这样的日期:

    var result =
    (
    from o in salesEntities.Orders 
    where o.OrderDate < System.Data.Objects.EntityFunctions.AddDays(DateTime.Today,-20) 
    select o
    );
    

    【讨论】:

    • 这在实体框架 6 中不再有效。请改用:System.Data.Entity.DbFunctions.AddDays
    【解决方案3】:

    简短的回答是否定的。 linq to entity 表达式中的所有内容都必须位于局部变量中,或者能够被实体框架转换为 sql 表达式。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多