我在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之间获取行。
如何组合这两个表达式?
感谢
答案 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));