Entity Framework 4 Single () vs First () vs FirstOrDefault ()

Я ' У меня дьявольское время, когда я нахожу сравнение различных способов запроса одного элемента и времени использования каждого из них.

Есть ли у кого-нибудь ссылка, которая сравнивает все это, или краткое объяснение того, почему вы будете использовать один над другим? Есть ли еще операторы, о которых я не знаю?

Спасибо.

111
задан abatishchev 5 May 2012 в 19:54
поделиться

4 ответа

Вот обзор различных методов:

  • Find () - когда вы хотите получить элемент по первичному ключу. Это вернет null, если не сможет найти элемент. Он будет смотреть в контексте перед переходом к базе данных (как указал Ярон в комментариях), что может быть важным фактором эффективности, если вам нужно получить одну и ту же сущность несколько раз, пока жив один и тот же контекст.

  • Single () - когда вы ожидаете, что запрос вернет ровно один элемент. Это вызовет исключение, если запрос не вернет ровно один элемент.

  • SingleOrDefault () - когда вы ожидаете, что запросом будет возвращен ноль или один элемент (т.е. вы не уверены, существует ли элемент с данным ключом). Это вызовет исключение, если запрос не вернет ни одного элемента.

  • First () - когда вы ожидаете, что один или несколько элементов будут возвращены запросом, но вы хотите получить доступ только к первому элементу в вашем коде (здесь порядок может быть важен в запросе). Это вызовет исключение, если запрос не вернет хотя бы один элемент.

  • FirstOrDefault () - когда вы ожидаете, что запросом будет возвращено ноль или более элементов, но вы хотите получить доступ только к первому элементу в вашем коде (т. Е. Вы не уверены, существует ли элемент с данным ключом)

198
ответ дан 24 November 2019 в 03:00
поделиться

Это действительно очень просто: Single возвращает один элемент и генерирует исключение, если их нет или больше одного элемента. Сначала вернет первый элемент или выбрасывает, если его нет. FirstOrDefault вернет первый элемент или значение по умолчанию (которое равно null в случае, если данный тип является ссылочным типом) при отсутствии элемента.

Это то поведение, которым должен обладать API. Однако обратите внимание, что базовая реализация может иметь другое поведение. Хотя Entity Framework этому подчиняется, O / RM, например LLBLGen, также может возвращать null при вызове First , что очень странно. Это было очень странное (и упорное) решение дизайнера IMO.

15
ответ дан 24 November 2019 в 03:00
поделиться

У каждого из четырех методов есть свое место; Хотя на самом деле у вас всего две разные операции.

  • Первый - ожидая набора результатов, содержащего несколько элементов, дайте мне первый элемент в этом наборе.
  • Одиночный - Ожидая одного результата, отдайте мне этот предмет.

Версия xxxxOrDefault () просто добавляет: «Я не хочу рассматривать пустой набор результатов как исключительное обстоятельство».

8
ответ дан 24 November 2019 в 03:00
поделиться

Я всегда использую FirstOrDefault . Если вы действительно хотите придирчиво к производительности, вам следует использовать FirstOrDefault в EF. Скрытые SingleOrDefault использует top (2) в запросе, потому что ему необходимо проверить, есть ли вторая строка, которая соответствует критериям, и, если это так, выдает исключение. Обычно в SingleOrDefault вы говорите, что хотите вызвать исключение, если ваш запрос возвращает более 1 записи.

19
ответ дан 24 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: