【问题标题】:Cast lambda expression to derived type将 lambda 表达式转换为派生类型
【发布时间】:2013-04-05 08:43:58
【问题描述】:

我需要一点魔法。我相信我正在尝试做的事情是有道理的,但如果我没有发现计划存在问题,那么原因同样受欢迎。

我有一个表情

Expression<Func<Entity, bool>>

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

Expression<Func<Derived, bool>>

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

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

感谢您的帮助。

【问题讨论】:

  • 如果在查询中添加 Cast 会怎样?
  • 我不确定这是否是重复的,但它肯定与我的this question 非常相似。
  • 该死的。我很厚。感谢您指出流血明显。

标签: c# linq lambda expression derived-class


【解决方案1】:

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

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

【讨论】:

  • 我现在将它用于 linq2db,因此我可以将我的属性放在派生类中。这是我找到的最佳解决方案。
【解决方案2】:

如果您的表达式为 Expression&lt;Func&lt;Entity, bool&gt;&gt;,您可以向其中添加 Cast&lt;Derived&gt; 以过滤到该特定类型的所有实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    相关资源
    最近更新 更多