Я получаю исключение каждый раз, когда я выбираю как это
Feature f = o.Features.SingleOrDefault(e => e.LinkName == PageLink);
потому что это может возвратить один или несколько, чем один элемент. Каков альтернативный подход, который я могу использовать для решения этой проблемы?
Single и SingleOrDefault предназначены для выдачи, если в последовательности существует более одного совпадения. Следствием этого является то, что вся последовательность должна быть повторена до завершения. Это не похоже на то, что вы хотите. Вместо этого попробуйте FirstOrDefault:
Feature f = o.Features
.FirstOrDefault(e => e.vcr_LinkName == PageLink && e.bit_Activate == true);
Это (как правило) будет работать лучше, потому что оно завершится, как только будет найдено совпадение.
Конечно, если вы действительно хотите сохранить более одного элемента, предложение Where было бы более подходящим:
IEnumerable<Feature> fs = o.Features
.Where(e => e.vcr_LinkName == PageLink && e.bit_Activate == true);
SingleOrDefault
предполагает, что вы ожидаете от вашего запроса 0 или 1 результат. Если у вас их больше 1, значит, с вашими данными или запросом что-то не так.
Если вы ожидаете более одного результата и хотите получить только первый, тогда следует использовать FirstOrDefault
.
Если вы хотите сначала только элемент, используйте вместо него FirstOrDefault
.
В основном, вот варианты с точки зрения допустимых результатов (т.е. куда вы не хотите бросать) и что использовать:
Один
SingleOrDefault
Первый
FirstOrDefault
( ElementAt
и ElementAtOrDefault
, Last
] и LastOrDefault
также доступны.)
Если вы используете SingleOrDefault, если условие удовлетворяет больше, чем результат, это приведет к ошибке.
Вы можете достичь результата, используя FirstOrDefault
Одиночный
означает, что вы ожидаете, что в последовательности будет один элемент.
SingleOrDefault
означает, что вы ожидаете, что в последовательности будет один или ноль элементов.
Это следует использовать, когда вы хотите знать, что есть один (или ноль), и вы хотите, чтобы он аварийно завершал работу, когда возвращалось более одного.
Если вам нужен только один, используйте First
(или FirstOrDefault
), как предложено выше, но убедитесь, что вы правильно упорядочили данные.