2

こんにちは。Linq to Entities を使用して取得した IQueryable オブジェクトの Where 句拡張メソッド内でブール演算を使用する際に問題が発生しています。最初の例は、Where 句の拡張メソッドに移動する必要がある操作として Bool1 を使用して何が機能するかを示しています。2 番目の例は、変更後に機能しないものです。Bool1 は完全に無視され、結果には影響しません。

例 1:

var results =
     from a in context.aTable1
     where a.Bool1 == false && a.Bool2  == false
     select new
     {
           Column1 = a.Column1
           Bool1 = a.Bool1
           Bool2 = a.Bool2
     };

results.Where(l => l. Column1.Contains(fooString));

例 2:

var results =
     from a in context.aTable1
     where a.Bool2  == false
     select new
     {
           Column1 = a.Column1
           Bool1 = a.Bool1
           Bool2 = a.Bool2
     };

results.Where(l => l.Bool1 == false);
results.Where(l => l. Column1.Contains(fooString));

これらは単純化された例ですが、私がやろうとしていることを示してくれることを願っています. where 拡張メソッドは別のメソッドにあり、元のクエリを作成しているときに実行できない理由です。

そのwhere句で同じことを行う次の他の方法を試しました:

results.Where(l => !l.Bool1);
results.Where(l => l.Bool1.Equals(false));

それらは何もない同じ効果を持っています。

4

4 に答える 4

5

2 番目と 3 番目のクエリは、何にも割り当てていないため、「失われています」。代わりに次のようにしてみてください。

var results = from a in context.aTable1
              where !a.Bool2
              select new
              {
                  Column1 = a.Column1
                  Bool1 = a.Bool1
                  Bool2 = a.Bool2
              };

results = results.Where(l => !l.Bool1);
results = results.Where(l => l.Column1.Contains(fooString));
于 2009-11-25T17:59:28.503 に答える
2

クエリの結果を何にも割り当てていません。を呼び出すたびWhere()に、そのクエリの結果が返されますが、これを処理する必要があります。

あなたの場合、いくつかのオプションがあります(すべて同じ最終結果を生成します):

  • Bool1 以外の結果で何かをしたい場合は、それらを保持することを選択できます。

    var notBool1 = results.Where(l => !l.Bool1);
    var query = notBool1.Where(l => l.Column1.Contains(fooString));
    
  • Where()呼び出しを連鎖させることができます:

    var query = results.Where(l => !l.Bool1)
                       .Where(l => l.Column1.Contains(fooString));
    
  • これはおそらく最速ですが、おそらくそれほどではありません。

    var query = results.Where(l => !lBool1 && l.Column1.Contains(fooString));
    
于 2009-11-25T17:59:46.533 に答える
0

.Whereクエリはコレクションを返しますが、呼び出されたコレクションは変更されません。

var numbers = new int [] { 1,2,3,4,5,6};
numbers.Where(x => x % 2 == 0); // numbers still contains 1,2,3,4,5,6
var evens = numbers.Where(x => x % 2 == 0); // evens contains 2,4,6, numbers 1,2,3,4,5,6
numbers = numbers.Where(x => x % 2 == 0); // numbers now contains 2,4,6
于 2009-11-25T18:09:58.137 に答える
0

どうですか

results.Where(l => l.Bool1 == false && l.Column1.Contains(fooString));
于 2009-11-25T18:00:51.427 に答える