gpt4 book ai didi

c# - 为什么 LINQ-to-Entities 识别我的自定义方法?

转载 作者:太空狗 更新时间:2023-10-29 17:53:02 24 4
gpt4 key购买 nike

这个有效:

Entities.WorkOrderSet.Where(MyCustomMethod);

这不是:

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

([Edit] 即使没有 new,它也不起作用)

我明白为什么第二个行不通 - 但为什么第一个行得通!?我不应该得到一个 “LINQ-to-Entities 无法识别方法...” 在运行时,就像第二个一样?

作为引用,这里是 MyCustomMethod

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

使用 EF1,而不是 EF4

最佳答案

首先起作用是因为它 是一个扩展方法并且 正在将查询作为函数执行,然后过滤您的列表see here .所以一般来说它会自动将 where to 转换为

 Where(Func<WorkOrder, bool>

第二个不是,因为它将您的 where 语句下推到数据库。当评估 lambda 表达式时,它会像这样展开:

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

这是一个很好的article这解释了 Expressions与函数

Here is another SO post that helps to explain the difference

[编辑 (BlueRaja)]

这个新的编辑似乎是正确的。澄清一下:似乎Func<WorkOrder, bool>可以隐式转换为 Expression<Func<WorkOrder, bool>> ,但反之则不然。

重载了 Where对于这两种类型。 .Where(MyCustomMethod)正在调用 Func<WorkOrder, bool>一个,而 .Where(o => MyCustomMethod(o))正在调用 Expression<Func<WorkOrder, bool>>一个。

关于c# - 为什么 LINQ-to-Entities 识别我的自定义方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com