Вам нужно будет проанализировать Expression
, который возвращается из свойства Expression
в реализации IQueryable<T>
.
Вам придется запросить метод Queryable.Where
, вызываемый при сканировании дерева Expression
.
Также обратите внимание, что пока Queryable.Where
будет наиболеераспространенный способ обнаружения фильтра where
, синтаксис запроса позволяет использовать другие реализации (в зависимости от того, какие пространства имен используются в директивах using
);если у вас есть что-то, что не использует метод расширения Queryable.Where
, тогда вам придется искать это явно (или использовать более общий метод фильтрации для метода Where
, который принимает IQueryable<T>
и возвращает IQueryable<T>
).
Класс ExpressionVisitor
(как указывает xanatos ) обеспечивает очень простой способ обхода дерева Expression
, я настоятельно рекомендую использоватьэтот подход является основой для обработки вашего Expression
дерева.
Следует отметить, что реализации класса ExpressionVisitor
необходимы для хранения и представления состояния на уровне класса.Из-за этого было бы лучше (IMO) создать внутренние классы, которые выполняют действие один раз, а затем иметь открытый метод, который каждый раз создает новый экземпляр ExpressionVisitor
;это поможет справиться с изменяющимся состоянием и, если все сделано правильно, позволит методу быть также потокобезопасным (если это ваше дело).