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 is is executing the query as a func, and then filtering your list see here.
So in general it would automatically cast the where to
Where(Func<WorkOrder, bool>
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:
Where( Expresion<Func<WorkOrder, bool>>)
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 to Expression<Func<WorkOrder, bool>>
, but not the other way around.
There are overloads of Where
for both types. .Where(MyCustomMethod)
is calling the Func<WorkOrder, bool>
one, whereas .Where(o => MyCustomMethod(o))
is calling the Expression<Func<WorkOrder, bool>>
one.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With