2011-08-25 6 views
2

を投げている私持ってEntity Frameworkのを使用して、次のコード:IEnumerable.Singleは例外

g_getWidgets = from getWidgets in g_libraryEntities.GET_Widgets() select getWidgets; 
. 
. 
. 
IQueryable<GET_Fragments_Result> iqueryable = g_getWidgets.AsQueryable<GET_Widgets_Result>(); 
var nameValueObject = from nv in iqueryable where nv.ID == int.Parse(key) select nv; 
widget = nameValueObject.Single(); 

widget = nameValueObject.Single();ラインが言って例外をスローします」

この機能を実行するための適切な方法は何ですかThe result of a query cannot be enumerated more than once.

答えて

3

FirstOrDefaultの代わりにSingleOrDefaultを使用することをおすすめします。

Enumerable.FirstOrDefault()

配列に要素がない場合にシーケンスの最初の要素、またはデフォルト値を返します。

出典:http://msdn.microsoft.com/en-us/library/bb340482.aspx

これは、複数の一致がある場合は、見つかった最初のものだけが返されることを意味します。

Enumerable.SingleOrDefault()

配列が空の場合のシーケンスの唯一の要素、またはデフォルト値を返します。シーケンス内に複数の要素がある場合、このメソッドは例外をスローします。

出典:http://msdn.microsoft.com/en-us/library/bb342451.aspx

これは、複数の一致がある場合は、例外がスローされることを意味しています。重複するエントリがデータ違反の場合に便利です。

0

これは、IDが等しいと一致するものを1つだけ探しているので、同じことが成り立ちます。

var nameValueObject = iqueryable.First(o => o.ID == int.Parse(key)); 

一致が見つからない場合に例外がスローされないようにするには、代わりにFirstOrDefaultを使用します。その場合、戻り値はnullでもかまいませんが、存在する項目が不変の場合は、Firstを使用して早期にクラッシュすることをお勧めします。