IEnumerable.Single正在抛出异常

时间:2011-08-25 19:35:50

标签: c# entity-framework linq-to-sql

我有以下使用实体框架的代码:

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.

执行此功能的正确方法是什么?我只想返回一个带有正确ID的项目。

2 个答案:

答案 0 :(得分:3)

我建议使用SingleOrDefault代替FirstOrDefault

  

<强> Enumerable.FirstOrDefault()

     

返回序列的第一个元素,如果序列不包含元素,则返回默认值。

     

来源:http://msdn.microsoft.com/en-us/library/bb340482.aspx

这意味着如果有多个匹配项,则只返回找到的第一个匹配项。

  

<强> Enumerable.SingleOrDefault()

     

返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,则此方法抛出异常。

     

来源:http://msdn.microsoft.com/en-us/library/bb342451.aspx

这意味着如果有多个匹配项,则抛出异常。如果重复条目是数据违规,这将非常有用。

答案 1 :(得分:0)

这将完成同样的事情,因为你只是寻找ID s相等的单一匹配。

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

如果您不希望在未找到匹配项时抛出异常,请使用FirstOrDefault。在这种情况下,返回值可能为null,但如果现有项是不变量,我宁愿使用First并提前崩溃。