如何合并两个LINQ表达式?

3
我有以下的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个回答

7

虽然有点丑陋,但如果您想将它们保留为表达式:

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

如果你能够将它们更改为Func,那么代码会更加简洁:
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();

6

你觉得...

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

嗯,那个可以用。但我想做这样的事情: stats.Where(e1 || e2) 但是没有成功。 - stephone
@stephone 在这种情况下,我最喜欢juharr的解决方案 stats = stats.Where(e1).Union(stats.Where(e2)); - Kevin DiTraglia
该解决方案返回所有表行。 - stephone

1
你可以这样做一个联合。
stats = stats.Where(e1).Union(stats.Where(e2));

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

由于e1/e2是表达式,您需要执行e1.Compile(s) || e2.Compile(s) - Aducci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接