代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

为什么Linq to Entities识别我的自定义方法?

  •  9
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 14 年前

    这工作:

    Entities.WorkOrderSet.Where(MyCustomMethod);
    

    这不:

    Entities.WorkOrderSet.Where(o => MyCustomMethod(o));
    

    ( [编辑] 即使没有 new ,不起作用)

    我明白为什么第二个不行- 但世界上为什么要做第一件事!? 我不应该得到一个 “Linq to Entities无法识别方法…” 在运行时,比如第二个?

    这里是MyCustomMethod供参考

    public bool MyCustomMethod(WorkOrder workOrder)
    {
        return !workOrder.WorkOrderNum.StartsWith("A", StringComparison.CurrentCultureIgnoreCase);
    }
    

    使用EF1,而不是EF4

    2 回复  |  直到 13 年前
        1
  •  6
  •   Community CDub    7 年前

    第一次成功是因为它 是一个扩展方法,并且是 正在将查询作为func执行,然后筛选列表 see here . 所以一般来说,它会自动将

     Where(Func<WorkOrder, bool>
    

    第二个不是因为它将您的WHERE语句下推到数据库中。当对lambda表达式进行计算时,它的展开方式如下:

    Where( Expresion<Func<WorkOrder, bool>>)
    

    这是一个好消息 article 这说明 Expressions FUNC

    Here is another SO post that helps to explain the difference

    [编辑(blueraja)]

    新编辑似乎是正确的。澄清:似乎 Func<WorkOrder, bool> 可隐式强制转换为 Expression<Func<WorkOrder, bool>> 但不是相反。

    存在过载 Where 这两种类型。 .Where(MyCustomMethod) 正在呼叫 功能工作订单,bool> 一,而 .Where(o => MyCustomMethod(o)) 正在呼叫 表达式<func<workorder,bool>> 一个。

        2
  •  1
  •   Artiom Chilaru    14 年前

    只是在这里把它形成一个“答案”,而不是一个评论。

    我认为这是.NET 4中的一个新功能,框架意识到这个函数不能转换为SQL,但可以在内存中轻松处理。所以它将整个数据集获取到本地机器并继续查询处理。

    这是第一个代码片段,当转换为表达式树时,它会直接说它运行一个外部方法,而第二个代码片段并不是那么“直接”。我想这就是为什么在第一种情况下,L2E可以很容易地理解正在发生的事情,并决定要做什么,而在第二种情况下,它“认为”最好发送一个异常,让开发人员更仔细地考虑一下。^^