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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…