将Lambda表达式转换为派生类型

8

我需要一点魔法。我相信我的计划是有意义的,但如果我没有看到问题,那么原因同样受欢迎。

我有一个表达式

Expression<Func<Entity, bool>>

我想要转换或甚至创建一个全新的表达式:

Expression<Func<Derived, bool>>

这被用作EF过滤查询,作为参数传递给存储库方法。存储库返回一个可枚举的实体,所以我可以很容易地使用协变,但我想在返回之前对查询进行一些后处理,使其成为派生状态。

我觉得EF必须在内部自己做到这一点,但我想运行我的查询,使结果类型为Derived类型而不是Entity。

谢谢您的帮助。


2
如果您在查询中添加了 Cast<Derived>,会发生什么? - Wouter de Kort
我不确定这是否是一个重复的问题,但它肯定非常类似于我的这个问题 - Jon
啊,该死。我太蠢了。谢谢你指出如此明显的错误。 - MJM
2个回答

5

在表达式级别上工作,您可以构建一个新的表达式,其参数类型为Derived

var entityExpr = (Expression<Func<Entity, bool>>)(e => e.Str == "");
var derivedExpr = Expression.Lambda<Func<Derived, bool>>(entityExpr.Body, entityExpr.Parameters);

我现在正在使用这个来处理linq2db,这样我就可以将我的属性放在派生类中。这是我找到的最好的解决方案。 - Antonio Rodríguez

3
如果您有一个表达式Expression<Func<Entity, bool>>,您可以在其上添加Cast<Derived>来过滤所有特定类型的实体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接