强制表达

时间:2018-07-17 10:09:31

标签: c# iqueryable linq-expressions variance

我有以下内容:

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 个答案:

答案 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>