我有以下内容:
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>
解决此问题的最佳方法是什么?
答案 0 :(得分:8)
实用的解决方法是:
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>