投射表情

Cast an Expression

我有以下内容:

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>>),returns IQueryable<Base> 而不是 IQueryable<Derived>.

C# 不允许将 filter 转换为 Expression<Func<Derived, bool>>,并且将 Where 返回的 IQueryable<Base> 转换为 IQueryable<Derived> 失败在运行时。

最好的解决方法是什么?

实用的修复是:

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>