Бросить выражение

У меня есть следующее:

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>
Другие вопросы по тегам