【问题标题】:convert Expression<Func<t, bool>> into Expression<Func<x, bool>> [duplicate]将 Expression<Func<t, bool>> 转换为 Expression<Func<x, bool>> [重复]
【发布时间】:2017-04-16 03:07:46
【问题描述】:

是否可以将 y 类型的表达式转换或强制转换为 x 类型的表达式?

类 y

public class y
{
    public int ID { get; set; }
}

类 x

public class x
{
    public int ID { get; set; }
}

表达式

Expression<Func<y, bool>>

如何将其转换/转换为

var t = (Expression<Func<x, bool>>)Expression<Func<y, bool>>

?

谢谢 瑞

【问题讨论】:

  • @GillBates 不要这么认为,object 是全局基类,而本题中的xy 没有关系。
  • @Kroltan:即使没有预定义的关系,基本思想还是一样的。必须重新创建表达式对象,并进行适当的转换以将一种参数类型映射到另一种。标记的副本包含大量描述该基本方法的信息。如果 OP 需要除此之外的帮助,他们需要发布一个新问题,其中包括一个很好的 minimal reproducible example,根据可用信息显示他们已经尝试过的内容,并解释他们所拥有的具体麻烦了。

标签: c# expression


【解决方案1】:

如果xy 之间没有关系,则不能,至少不能作为演员。

您可以做的是提供从xy 的转换。一般是这样的:

public static Expression<Func<TB, TReturn>> ConvertExpression<TA, TB, TReturn>(
    Expression<Func<TA, TReturn>> expr,
    Func<TB, TA> converter
) {
    return (TB input) => expr.Compile()(converter(input));
}

然后,要实际转换表达式,您需要提供从yx 的转换:

ConvertExpression(yourExpressionX, yVal => new x {ID = yVal.ID});

【讨论】:

  • 虽然代码看起来正是我所追求的,一个转换器,我得到 System.NotSupportedException: The LINQ expression node type 'Invoke' is not supported in LINQ to Entities。使用 EF 执行 Where 时。
  • @Rui 嗯。不幸的是,我不熟悉 LINQ to Entities。没有它似乎工作得很好,所以我怀疑这是对该库的限制。那么,您可能想找到替代解决方案。也许问一个更具体的问题,包括您在哪里使用它的详细信息,minimal reproducible example 使用 L2E,以便有相关知识的人可以帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-06-17
相关资源
最近更新 更多