2016-11-08 13 views
1

レッツは、我々は(LinqPadで)このきゅうコードを持っていると言う:Linqクエリ "where [column] in(値のリスト)"は各値に対して単一の値を返しますか?

List<string> list = new List<string>(); 
list.Add("1611080010"); 
list.Add("1611080011"); 
list.Add("WRONGID"); 

var result = Orders.AsQueryable().Where(y => list.Contains(y.Id)); 
// And yes my Ids are string for this sample 
result.Dump(); // To display the result in LinqPad 
result.Count(); // equal 2 

は、それは私のリスト要素ごとに1つの要素を返すか、例外をスローするようにシステムを強制的にこのクエリを改善することは可能ですか?私のリストに3つの値がある場合、結果に3つの値が必要ですか?あなたの質問に

+0

あなたが効率的になりたいのであれば、リストは実際には代わりにハッシュセットでなければならないので、ContainsはO(n)ではなくO(1)です。 –

答えて

2

が、それは私のリスト要素ごとに1つの要素を返すか、例外をスローするようにシステムを強制的にこのクエリを向上させることが可能である:

var result = Orders.AsQueryable().SingleOrDefault(y => list.Contains(y.Id)); 

SingleOrDefault

シーケンスの唯一の要素、または シーケンスが空の場合はデフォルト値を返します。このメソッドは、シーケンス内に1つの要素よりも多くの要素がある場合は例外をスローします。あなたはSingleOrDefaultを使用するたびにあなたが1以下

から任意のものを使用することができます

1

、あなたは明らかにクエリが高々単一の結果を生じるはずであると述べています。一方、FirstOrDefaultが使用されている場合、クエリは任意の量の結果を返すことができますが、最初のものだけを必要とすることを指定します。

私は個人的にセマンティクスが非常に異なり、適切なものを使用すると、期待される結果に応じて、読みやすさが向上します。

var result = Orders.AsQueryable().SingleOrDefault(y => list.Contains(y.Id)); 

var result = Orders.AsQueryable()..FirstOrDefault(y => list.Contains(y.Id)); 
1

私が正しくあなたの質問を理解していれば、あなたがオブジェクトのIDは、あなたのlistのidに等しいとlistにおけるIdは例外がすべきOrdersオブジェクトに存在しない場合Ordersから一つのオブジェクトを返すようにしたいですスローされる。

var result = list.Select(id => Orders.AsQueryable().First(y => y.Id == id)).ToList(); 

listからIdはOrdersオブジェクト内の一致を持っていない場合、これは例外がスローされます:あなたができることを実現するために

。すべてのIDが見つかった場合は、resultには、ID番号がlistと同じ数の要素が含まれます。

別のオプションは使用することです:

var result = list.Select(id => Orders.AsQueryable().FirstOrDefault(y => y.Id == id)).ToList(); 

これはエラーをスローしないだろうが、Idsがlistであるとして、それは常に同じ要素数を返します。しかし、見つからないIDはnullになります。

関連する問題