【问题标题】:How to combine two LINQ Expressions?如何组合两个 LINQ 表达式?
【发布时间】:2012-11-16 02:53:06
【问题描述】:

我在 c# 中有以下 LINQ 查询

var stats = from s in context.Stats                                                                                                  
        select s;

Expression<Func<Stat, bool>> e1 = s => s.Age >= 15 && s.Age < 25;
Expression<Func<Stat, bool>> e2 = s => s.Age >= 40 && s.Age < 50;

stats = stats.Where(e1);

此代码有效,并为我提供了 Stats 表中 Age 介于 15 到 25 之间的行。

现在,我想要从 15 到 25 以及从 40 到 50 的行。

如何组合这两个表达式?

谢谢

【问题讨论】:

    标签: c# linq expression


    【解决方案1】:

    怎么样...

    Expression<Func<Stat, bool>> e1 = s => 
       (s.Age >= 15 && s.Age < 25) || (s.Age >= 40 && s.Age < 50);
    

    【讨论】:

    • 嗯,这行得通。但我想做这样的事情:stats.Where(e1 || e2) 但没有成功
    • @stephone 在那种情况下,我最喜欢 juharr 的解决方案 stats = stats.Where(e1).Union(stats.Where(e2));
    • 该解决方案返回所有表行
    【解决方案2】:

    这有点难看,但如果你想将它们保留为表达式:

    stats = stats.Where(s => (e1.Compile()(s) || e2.Compile()(s))).ToList();
    

    如果您可以将它们更改为Funcs,它会更干净:

    Func<Stat, bool> e1 = s => s.Age >= 15 && s.Age < 25;
    Func<Stat, bool> e2 = s => s.Age >= 40 && s.Age < 50;
    
    stats = stats.Where(s => e1(s) || e2(s)).ToList();
    

    【讨论】:

      【解决方案3】:

      你可以做这样的联合

      stats = stats.Where(e1).Union(stats.Where(e2));
      

      【讨论】:

        【解决方案4】:
        Expression<Func<Stat, bool>> GetOrExpression(
            Expression<Func<Stat, bool>> e1,
            Expression<Func<Stat, bool>> e2)
        {
            return s => e1.Compile()(s) || e2.Compile()(s);
        }
        
        Expression<Func<Stat, bool>> e1 = s => s.Age >= 15 && s.Age < 25;
        Expression<Func<Stat, bool>> e2 = s => s.Age >= 40 && s.Age < 50;
        
        stats = stats.Where(GetOrExpression(e1, e2));
        

        【讨论】:

        • 因为 e1/e2 是你需要做的表达式e1.Compile(s) || e2.Compile(s)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多