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



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



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



спасибо.

713   6  

6 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

для некоторых деталей производительности, особенно во втором случае вы можете выглядеть здесь: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

кроме того, в первой группе можно задавать сложные запросы, но с найти() метод вы можете предоставить только ключ сущности для поиска.

Single () и SingleOrDefault () обычно используется для уникальных идентификаторов, таких как идентификаторы, в то время как First () или FirstOrDefault () обычно используется для запроса, который может иметь несколько результатов, но вы хотите только "Top 1".

Single () или First () вызовет исключение, если результат не будет возвращен,SingleOrDefault () и FirstOrDefault () ловит исключение и возвращает значение null или значение по умолчанию(ResultDataType).

Comments

    Ничего не найдено.