2013-04-05 54 views
7

我需要一点魔力。我相信我想要做的事情是有道理的,但如果我没有看到这个计划有什么问题,那么为什么会这么欢迎。将拉姆达表达式转换为派生类型

我有一个表达

Expression<Func<Entity, bool>>

,我想投/转换,甚至创造出一种全新的表达:

Expression<Func<Derived, bool>>

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

在我看来,EF必须在内部做到这一点,但我希望能够运行我的查询,以便结果的类型是派生类型而不是实体。

感谢您的帮助。

+2

如果添加了一个演员怎么查询? – 2013-04-05 08:46:29

+0

我不确定这是否是重复的,但它肯定与我的[此问题](http://stackoverflow.com/q/2797261/50079)非常相似。 – Jon 2013-04-05 08:53:42

+0

阿格该死。我很厚。感谢您指出明显的出血。 – MJM 2013-04-05 08:55:13

回答

3

如果你有你的表达Expression<Func<Entity, bool>>你可以添加一个Cast<Derived>它过滤到所有具有该特定类型的实体。

3

工作的Expression水平,你可以建立具有Derived类型作为参数的新表情:

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