如何组合两个LINQ表达式?

时间:2012-11-15 16:43:11

标签: c# linq expression

我在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之间获取行。

如何组合这两个表达式?

感谢

4 个答案:

答案 0 :(得分:6)

怎么样......

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

答案 1 :(得分:3)

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

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

如果你可以将它们更改为Func s更干净:

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();

答案 2 :(得分:1)

你可以像这样做一个联盟

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

答案 3 :(得分:0)

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));