This works:
Entities.WorkOrderSet.Where(MyCustomMethod);
This does not:
Entities.WorkOrderSet.Where(o => MyCustomMethod(o));
([Edit] Even without new, it doesn’t work)
I understand why the second doesn’t work – but why in the world does the first work!? Shouldn’t I get a “LINQ-to-Entities does not recognize the method…” at runtime, like with the second?
For reference, here is MyCustomMethod
public bool MyCustomMethod(WorkOrder workOrder)
{
return !workOrder.WorkOrderNum.StartsWith("A", StringComparison.CurrentCultureIgnoreCase);
}
Using EF1, not EF4
First works because it
is an extension method and isis executing the query as a func, and then filtering your list see here.So in general it would automatically cast the where to
Second doesn’t because it is pushing your where statement down to the db. When the lambda expression is evaluated it is expanded like this:
Here is a good article that explains Expressions vs Func
Here is another SO post that helps to explain the difference
[Edit (BlueRaja)]
This new edit appears to be correct. To clarify: it seems
Func<WorkOrder, bool>is implicitly castable toExpression<Func<WorkOrder, bool>>, but not the other way around.There are overloads of
Wherefor both types..Where(MyCustomMethod)is calling theFunc<WorkOrder, bool>one, whereas.Where(o => MyCustomMethod(o))is calling theExpression<Func<WorkOrder, bool>>one.