0
var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
                      .Where(d => (d.codes.Count == querycodes.Count() &&
                                  !d.codes.Except(querycodes).Any()));

エラーがスローされます:

式のシリアル化情報を特定できません: Enumerable.Count(Enumerable.Except(d.codes, String[]:{ "aaa", "bbb" ... }))。

クエリの目標を達成するにはどうすればよいですか?

4

1 に答える 1

0

残念ながら、公式ドライバーは現在サポートしていないようです-ここExcept()のリストにはありません

(maps to $in)のような非標準の拡張機能Inがたくさんあります。おそらく、これらのいずれかを回避策として使用できます。(私は見ることができませんでした$ninが、おそらく!Inにマッピングされ$ninますか?)

Except最後の手段として、コレクションの一部を具体化し、Linq を使用してメモリ内をオブジェクトに適用する必要がある場合があります。

編集これは、コレクション全体がメモリに取り込まれる最後の手段です。これは、多数のオブジェクトがある場合にはお勧めできません。

var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
                      .ToList()
                      .Where(d => (d.codes.Count == querycodes.Count() &&
                                  !d.codes.Except(querycodes).Any()));

または、Count()が ( として$size) 実装されているため、Mongo で最初のパス フィルターを実行してから、メモリで 2 番目のパスを実行することをお勧めします。

var querycodes= new string[] {"aaa", "bbb", "ccc"};
var query = collection.AsQueryable<Source>()
                      .Where(d => d.codes.Count == querycodes.Count())
                      .ToList()
                      .Where(d => !d.codes.Except(querycodes).Any()));
于 2013-09-12T06:22:05.713 に答える