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

时间:2013-04-05 08:43:58

标签: c# linq lambda expression derived-class

我需要一点魔法。我相信我想要做的事情是有道理的,但如果我没有看到计划的问题,原因就会受到欢迎。

我有一个表达

Expression<Func<Entity, bool>>

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

Expression<Func<Derived, bool>>

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

在我看来,EF必须在内部执行此操作,但我希望能够运行我的查询,以便结果的类型是派生类型而不是实体。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如果您有表达式Expression<Func<Entity, bool>>,则可以向其添加Cast<Derived>以过滤到该特定类型的所有实体。

答案 1 :(得分:3)

Expression级别上,您可以构建一个以Derived类型为参数的新表达式:

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