我有以下使用实体框架的代码:
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的项目。
答案 0 :(得分:3)
我建议使用SingleOrDefault
代替FirstOrDefault
。
<强> Enumerable.FirstOrDefault()强>
返回序列的第一个元素,如果序列不包含元素,则返回默认值。
这意味着如果有多个匹配项,则只返回找到的第一个匹配项。
<强> Enumerable.SingleOrDefault()强>
返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,则此方法抛出异常。
这意味着如果有多个匹配项,则抛出异常。如果重复条目是数据违规,这将非常有用。
答案 1 :(得分:0)
这将完成同样的事情,因为你只是寻找ID
s相等的单一匹配。
var nameValueObject = iqueryable.First( o => o.ID == int.Parse(key) );
如果您不希望在未找到匹配项时抛出异常,请使用FirstOrDefault
。在这种情况下,返回值可能为null,但如果现有项是不变量,我宁愿使用First
并提前崩溃。