IEnumerable.Single создает исключение - PullRequest
2 голосов
/ 25 августа 2011

У меня есть следующий код, который использует Entity Framework:

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.

Как правильно выполнить эту функцию? Я просто хочу вернуть товар с правильным идентификатором.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Я бы рекомендовал использовать SingleOrDefault вместо FirstOrDefault.

Enumerable.FirstOrDefault ()

Возвращает первый элемент последовательности или значение по умолчанию, если последовательность не содержит элементов.

Источник: http://msdn.microsoft.com/en-us/library/bb340482.aspx

Это означает, что при наличии более одного совпадения будет возвращен только первый найденный.

Enumerable.SingleOrDefault ()

Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод генерирует исключение, если в последовательности более одного элемента.

Источник: http://msdn.microsoft.com/en-us/library/bb342451.aspx

Это означает, что при наличии более одного совпадения выдается исключение. Это полезно, если наличие дублированных записей является нарушением данных.

0 голосов
/ 25 августа 2011

Это выполнит то же самое, поскольку вы ищете только один матч, где ID s равны.

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

Если вы не хотите, чтобы возникало исключение, если совпадение не найдено, используйте FirstOrDefault. В этом случае возвращаемое значение может быть нулевым, но если существующий элемент является инвариантом, я бы предпочел использовать First и аварийно завершить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...