Вот обзор различных методов:
Find () - когда вы хотите получить предмет по первичному ключу. Это вернет null, если не сможет найти элемент. Он будет искать в контексте перед переходом к базе данных (как указал Ярон в комментариях), что может быть важным фактором эффективности, если вам нужно получить одну и ту же сущность несколько раз, пока жив один и тот же контекст.
Single () - когда вы ожидаете, что запрос вернет ровно один элемент. Это вызовет исключение, если запрос не вернет ровно один элемент.
SingleOrDefault () - когда вы ожидаете, что запросом будет возвращен ноль или один элемент (т.е. вы не уверены, существует ли элемент с заданным ключом). Это вызовет исключение, если запрос не вернет ни одного элемента.
First () - когда вы ожидаете, что один или несколько элементов будут возвращены запросом, но вы хотите получить доступ только к первому элементу в вашем коде (здесь порядок может быть важен в запросе). Это вызовет исключение, если запрос не вернет хотя бы один элемент.
FirstOrDefault () - когда вы ожидаете, что запросом будет возвращено ноль или более элементов, но вы хотите получить доступ только к первому элементу в вашем коде (т.е. вы не уверены, существует ли элемент с заданным ключом)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
илиSingleOrDefault
запрос 2 записей (ограничение 2), в то время как запросFirst
илиFirstOrDefault
1 (ограничение 1).Я всегда стараюсь использовать
FirstOrDefault
. Если вы действительно хотите быть придирчивыми к производительности, вам следует использоватьFirstOrDefault
EF. ВSingleOrDefault
запросе « Под обложками» используется top (2), потому что ему необходимо проверить, есть ли вторая строка, соответствующая критериям, и, если она соответствует, выдает исключение. В основномSingleOrDefault
вы говорите, что хотите вызвать исключение, если ваш запрос возвращает более 1 записи.источник
FirstOrDefault
и,SingleOrDefault
чтобы быть значимой? Я бы сказал, что в большинстве случаев это преждевременная оптимизация.Single()
илиSingleOrDefault()
возвращаю то, из чего должен существовать только один . Причина, по которой я это делаю, заключается в том, чтобы выявлять ошибки, выполняя плохо написанные запросы, которые возвращают больше, чем должны, терпят неудачу. По крайней мере, на мой взгляд, это поможет сохранить согласованность данных в системе. Конечно, это медленнее, но я предполагаю, что это не намного медленнее, и я готов заплатить эту цену.Это действительно очень просто:
Single
возвращает один элемент и генерирует исключение, если их нет или больше одного элемента.First
вернет первый элемент или выбросит, если его нет.FirstOrDefault
вернет первый элемент или значение по умолчанию (null
в случае, если данный тип является ссылочным), когда элемент отсутствует.Это то поведение, которое должен иметь API. Однако обратите внимание, что базовая реализация может иметь другое поведение. В то время как Entity Framework подчиняется этому, O / RM, такой как LLBLGen, также может возвращаться
null
при вызове,First
что очень странно. Это было очень странно (и упрямый) решение дизайнера ИМО.источник
Single
ясно выражает то, что вы ожидаете, что в результате будет только один элемент.У каждого из четырех методов есть свое место; Хотя на самом деле у вас всего две разные операции.
Версия xxxxOrDefault () просто добавляет: «Я не хочу рассматривать пустой набор результатов как исключительное обстоятельство».
источник
С другой стороны, вы можете разделить эти методы по основной логике, например:
Некоторые подробности о производительности, особенно во втором случае, можно посмотреть здесь: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
Кроме того, в первой группе вы можете определять сложные запросы, но с помощью метода Find () вы можете предоставить только ключ сущности для поиска.
источник
Single () и SingleOrDefault () обычно используются для уникальных идентификаторов, таких как идентификаторы, в то время как First () или FirstOrDefault () обычно используется для запроса, который может иметь несколько результатов, но вам нужен только «Top 1» .
Single () или First () вызовет исключение, если результат не будет возвращен, SingleOrDefault () и FirstOrDefault () перехватят исключение и вернут значение null или значение по умолчанию (ResultDataType).
источник