【问题标题】:C# how to combine two expressions into a new one?C#如何将两个表达式组合成一个新表达式?
【发布时间】:2012-01-12 19:19:43
【问题描述】:

我有两种表达方式:

public static Expression<Func<int, bool>> IsDivisibleByFive() {
   return (x) => x % 5 == 0;
}

public static Expression<Func<int, bool>> StartsWithOne() {
   return (x) => x.ToString().StartsWith("1");
}

我想创建一个同时适用于两者的新表达式(相同的表达式在我的代码中以不同的组合使用):

public static Expression<Func<int, bool>> IsValidExpression() {
   return (x) => IsDivisibleByFive(x) && StartsWithOne(x);
}

然后做:

public static class IntegerExtensions
{
    public static bool IsValid(this int self) 
    {
        return IsValidExpression().Compile()(self);
    }
}

在我的代码中:

if (32.IsValid()) {
   //do something
}

我有很多这样的表达式,我想定义一次,而不是到处重复代码。

谢谢。

【问题讨论】:

  • 您为什么首先使用表达式而不仅仅是委托?
  • 添加了更多细节,但基本上我的第三个代码块实际上不起作用,这就是“我希望我能做到的理论上的方式”。现在我必须手动创建一个新方法来返回前两个组合的表达式,然后我必须在我的代码库中分别维护它们。
  • 这是另一个帖子的副本:[组合两个表达式][1] [1]:stackoverflow.com/questions/457316/…
  • @svick:我想保留它们的表达式,以便 linq-to-sql 也可以翻译它们以针对数据库执行。这个想法是我定义了一次表达式,然后我可以选择将大部分相同的表达式用于数据库查询和 linq-to-objects。
  • 这能回答你的问题吗? Expression<Func<object, bool>> as Property

标签: c# linq lambda expression


【解决方案1】:

如果您只是尝试将表达式主体与AndAlso 表达式结合起来,您会遇到的问题是x 参数表达式实际上是两个不同的参数(即使它们具有相同的名称)。为此,您需要使用表达式树访问者将要组合的两个表达式中的 x 替换为单个常见的 ParameterExpression

您可能想查看Joe Albahari's PredicateBuilder library,它为您完成了繁重的工作。结果应该类似于:

public static Expression<Func<int, bool>> IsValidExpression() {
   return IsDivisibleByFive().And(StartsWithOne());
}

【讨论】:

  • 正是我想要的。谢谢
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多