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

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的商品。

最佳答案

我建议使用SingleOrDefault而不是FirstOrDefault


  Enumerable.FirstOrDefault()
  
  返回序列的第一个元素,如果序列不包含任何元素,则返回默认值。
  
  资料来源:http://msdn.microsoft.com/en-us/library/bb340482.aspx


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


  Enumerable.SingleOrDefault()
  
  返回序列的唯一元素;如果序列为空,则返回默认值;否则,返回默认值。如果序列中有多个元素,则此方法将引发异常。
  
  资料来源:http://msdn.microsoft.com/en-us/library/bb342451.aspx


这意味着如果存在多个匹配项,则会引发异常。如果重复条目违反了数据,这将很有用。

10-08 00:02