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

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

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

Спасибо.

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

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

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

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

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

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

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

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

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

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

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

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

С другой стороны, вы можете разделить эти методы с помощью основной логики, например:

  • Метод будет напрямую запрашивать базу данных : Single (), SingleOrDefault (), First (), FirstOrDefault ()
  • Метод будет выполнять поиск в кеше, прежде чем выдавать запрос к базе данных : Find ()

Для некоторых характеристик производительности, особенно во втором случае, вы можете посмотреть здесь: 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 или default (ResultDataType).

  • Как сделать массовую вставку - Linq для объектов
  • LINQ to Entities не распознает метод 'System.String Format (System.String, System.Object, System.Object)'
  • Зачем использовать LINQ Join для простого отношения «один-много»?
  • C # - код для заказа по свойству с использованием имени свойства в виде строки
  • Включить внуков в EF Query
  • Как преобразовать DbSet в инфраструктуру Entity в ObjectQuery
  • Указанный член типа не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности
  • Как вы создаете запрос LINQ to Entities для непосредственного загрузки дочерних объектов, вместо вызова свойства Reference или Load ()
  • linq для объектов не распознает метод
  • LEFT JOIN в LINQ для объектов?
  • Как выполнить сравнение даты в запросе EF?
  • Interesting Posts

    Основная HTTP-аутентификация на iPhone

    Закрыть диалог при нажатии (в любом месте)

    Доля базы данных между 2 приложениями в Heroku

    Перенаправление из атрибута фильтра действия

    Поверните простую C # DLL в компонент COM-взаимодействия

    Почему нам нужно указывать размер столбца при передаче 2D-массива в качестве параметра?

    Довольно новый жесткий диск ноутбука очень медленный

    Django admin: как отобразить поле, помеченное как редактируемое = False ‘в модели?

    Dash или Slash в пакетном файле?

    RDP эквивалент для Ubuntu 10.10

    Как перебрать атрибуты classа в Java?

    Пользовательский пузырь выноски MKPinAnnotation похож на пузырь по умолчанию

    Преобразовать java.util.HashMap в scala.collection.immutable.Map в java

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи. Программное обеспечение вызвало прерывание соединения: recv failed

    Возможно ли повторно назначить «специальные» клавиши на клавиатуре без водителя на другие функции в Windows 7

    Давайте будем гением компьютера.