0

Assetエンティティのリストがあり、それぞれに次のような 2 つのプロパティを持つエンティティAssetのリストがありますField

| Index | Value |
| 0 | "hello" |
| 1 | "blah" |
| 2 | null |

そしてループで変数を取得します

i = 2i = 3

そして、次を取得しようとAssetsするlinqクエリFieldがあります。ValueinullFieldIndex i

たとえば、iが 2 の場合、上の表を持つアセットが返されます。これは、Field2 が に対応する場所があるためnullです。

そして、 が 3 の場合は、i3 ではないため、上記も返す必要があります。FieldIndex

このコードは機能します:

var assets = (from a in assets where 
              a.Fields.Any(x => x.Index == i && x.Value == null) select a)
     .Union(from a in assets where 
              a.Fields.All(x => x.Index != i) select a)
     .ToList();

これはあまりいいことではありません.1つのステートメントでそれを行う方法はあるのでしょうか?

4

5 に答える 5

1

私が見ているように、いくつかのオプションがあります。

  1. アセット ID とインデックスに対してのみ、より伝統的な LINQ と LEFT JOIN の JOIN 構文を使用します。したがって、LEFT JOIN が null (つまりDefaultIfEmpty()) を返す場合、そのアセットのインデックスは見つかりませんでした。それがケース 2 です。ただし、それが null でない場合は、 is をチェックすることで、さらにフィルター処理 (つまり、句where)を行うことができます。それがケース#1です。Valuenull
  2. whereステートメントを組み合わせることができます。 where a.Fields.Any(...) || a.Fields.All.

私の意見では、両方を試して、どちらがニーズに適しているかを確認してください. 最初のオプションの方がはるかに優れたパフォーマンスを発揮すると思いますが、データ サイズが小さい場合は、2 番目のオプションの方がはるかに簡単です。

于 2013-05-31T15:21:04.980 に答える
0

この場合、実際にはクエリを少しショートカットできます

 var assets = (
                from a in assets
                where a.Fields.All(x => x.Index != i || x.Value == null)
                select a
              ).ToList();
于 2013-05-31T15:23:36.253 に答える
0
var assets = assets.where(a => a.Fields.Any(x => x.Index == i && x.Value == null) || a.Fields.All(x => x.Index != i)).ToList();
于 2013-05-31T15:21:11.690 に答える