投射表情
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>
我有以下内容:
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>