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

このコードは機能し、年齢が 15 から 25 の間の Stats テーブルから行を取得します。

今、私は15から25までと40から50までの行を取得したいと思います.

これらの 2 つの式を組み合わせるにはどうすればよいですか?

ありがとう

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

それらを s に変更できる場合は、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();
于 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 に答える