アイテムのコレクション (ADO.NET Entity Framework) があり、いくつかの異なる基準に基づいて検索結果としてサブセットを返す必要があります。残念ながら、条件が重複しているため、返される必要がある有効なアイテムが除外または重複するためWhere
、条件が満たされた (または条件が満たされていない) コレクションを取得することはできません。Where
各チェックを個別に行い、結果を組み合わせることにしました。を使用することを検討しAddRange
ましたが、結果リストに重複が生じます (私の理解では、毎回コレクションが列挙されます - ここで正しい/間違っていますか?)。Union
重複を挿入せず、必要になるまで列挙を延期することに気付きました(繰り返しますが、この理解は正しいですか?)。
検索は次のように記述します。
IEnumerable<MyClass> Results = Enumerable.Empty<MyClass>();
IEnumerable<MyClass> Potential = db.MyClasses.Where(x => x.Y); //Precondition
int parsed_key;
//For each searchable value
foreach(var selected in SelectedValues1)
{
IEnumerable<MyClass> matched = Potential.Where(x => x.Value1 == selected);
Results = Results.Union(matched); //This is where the problem is
}
//Ellipsed....
foreach(var selected in SelectedValuesN) //Happens to be integer
{
if(!int.TryParse(selected, out parsed_id))
continue;
IEnumerable<MyClass> matched = Potential.Where(x => x.ValueN == parsed_id);
Results = Results.Union(matched); //This is where the problem is
}
ただし、それResults = Results.Union(matched)
は のように機能しているようResults = matched
です。いくつかのテスト データとテスト検索を実行しました。検索では、最初のフィールドが -1、0、1、または 3 の結果が求められます。これにより、4 つの結果 (2 つの 0、1 および 3) が返されます。ループの最初の反復は期待どおりに機能し、Results はまだ空のままです。2 番目の反復も期待どおりに機能し、Results には 2 つの項目が含まれます。ただし、3 回目の繰り返しの後、Results には項目が 1 つだけ含まれます。
仕組みを誤解しただけ.Union
ですか、それともここで何か他のことが起こっていますか?