Entity Framework 4 Single () против First () против FirstOrDefault ()

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

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

Спасибо.

98 голосов | спросил asfsadf 15 AM00000020000003531 2010, 02:10:35

5 ответов


0

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

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

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

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

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

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

ответил Steve Willcock 15 AM00000020000001431 2010, 02:28:14
0

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

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

ответил Steven 15 AM00000020000001431 2010, 02:15:14
0

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

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

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

ответил Chris Shaffer 15 AM00000020000001331 2010, 02:35:13
0

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

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

Подробнее о производительности, особенно во втором случае, вы можете посмотреть здесь: https://msdn.microsoft. ком /EN-US /данных /hh949853.aspx F = 255 & амп;? MSPPError = -2147217396 # 3

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

ответил Kryszal 4 FriEurope/Moscow2015-12-04T03:44:02+03:00Europe/Moscow12bEurope/MoscowFri, 04 Dec 2015 03:44:02 +0300 2015, 03:44:02
0

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

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

ответил MilkTea027 26 J000000Friday13 2013, 07:54:37

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132