Бросить выражение
У меня есть следующее:
class Base
class Derived : Base
IQueryable<Derived> queryable = ???
Expression<Func<Base, bool>> filter = ???
Я хочу отфильтровать запрос с помощью выражения и получить обратно IQueryable<Derived>
,
Тем не мение, Expression
инвариантен Это означает, что queryable.Where(filter)
выводится, чтобы быть Where(this IQueryable<Base>, Expression<Func<Base, bool>>)
и возвращает IQueryable<Base>
скорее, чем IQueryable<Derived>
,
C# не позволяет filter
быть брошенным в Expression<Func<Derived, bool>>
и актерский состав IQueryable<Base>
вернулся Where
в IQueryable<Derived>
не удается во время выполнения.
Как лучше обойти это?
1 ответ
Решение
Прагматическое исправление:
var result = queryable.Where(filter).Cast<Derived>();
Вы также можете сделать это, переписав дерево выражений, но... это не стоит. Но это работает:
var typed = Expression.Lambda<Func<Derived, bool>>(
filter.Body, filter.Parameters);
var result = queryable.Where(typed); // IQueryable<Derived>