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

4 回答 4

6

怎么样...

Expression<Func<Stat, bool>> e1 = s => 
   (s.Age >= 15 && s.Age < 25) || (s.Age >= 40 && s.Age < 50);
于 2012-11-15T16:46:09.437 回答
6

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

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();
于 2012-11-15T16:49:29.460 回答
0

你可以做一个这样的联盟

stats = stats.Where(e1).Union(stats.Where(e2));
于 2012-11-15T17:05:07.173 回答
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));
于 2012-11-15T16:49:48.723 回答