Полезно понять разницу между Expression
и Func<>
.
В Expression
e => e.ID < 500
хранится информация о это выражение: есть T
e
, что вы обращаетесь к свойству ID
, вызывая оператор <
со значением int
500
. Когда EF смотрит на это, он может превратить его в нечто вроде [SomeTable].[ID] < 500
.
A Func
e => e.ID < 500
- это метод, эквивалентный:
static bool MyMethod(T e) { return e.ID < 500; }
Он скомпилирован как IL-код, который делает это; он не предназначен для «восстановления» SQL-запроса или чего-то еще, только запускается.
Когда EF принимает ваш Expression
, он должен понимать каждую его часть, потому что он использует это для построения SQL запрос. Он запрограммирован на то, что означает существующий метод Where
. Он не знает, что означает ваш метод Filter
, хотя это тривиальный метод, поэтому он просто уходит.