2014-01-17 12 views
8

LINQクエリを使用して、単一の結果が返されるかどうかを調べる必要があります。single()LINQがNULLを返すかどうか確認してください。

var propertyDataSource = (from x in myCollection 
          where SomeCondition(x) 
          select x).Single(); 

私のクエリは、単一の結果を持っていますが、結果がない場合、それはメッセージでSystem.InvalidOperationExceptionをスローしたときシーケンスに要素が含まれていない。これはいい作品:私はこのような結果を得るためにSingle()を呼び出します。

どうすればこの問題を解決できますか?

答えて

22

使用SingleOrDefaultを代わりに。

Singleは、列挙に厳密に1つの要素が含まれていないときに、がdefault(T)(参照型の場合はnull)を返します。列挙に複数の要素がある場合、両方がスローされることに注意してください。

5

Singleは、シーケンスが空の場合に例外をスローします。シーケンスが空の場合nullを返すにはSingleOrDefaultを使用してください。

7

.SingleOrDefault()は、参照型のためnullである(単一一致するオブジェクトまたはデフォルト値を返します。あなたはかなり迅速にNullReferenceExceptionになってしまいますので、あなたががnullケースを自分で処理する必要があります。

として、サイドノートでは、あなたはIEnumerable Sを使用しているとき、あなたのデータセット全体の繰り返し処理を避けるために.Any()の代わり.Count() > 0を使用する必要があります。

5

.FirstOrDefault()何も存在しない場合(一致するものがない場合)は、.Single()は正確に1つの一致を期待します。 .SingleOrDefault()は何も存在しない場合はnull(または型のデフォルト)を返しますが、複数の一致がある場合は例外をスローします。

関連する問題