Entity Framework 4 Single () vs First () vs FirstOrDefault ()
У меня чертовски время, когда мы находим сравнение различных способов запроса отдельного элемента и когда использовать его.
Кто-нибудь имеет ссылку, которая сравнивает все эти данные, или краткое объяснение того, почему вы будете использовать один за другим? Есть ли еще больше операторов, о которых я не знаю?
Спасибо.
- «Тип узла выражения LINQ« Invoke »не поддерживается в LINQ to Entities» - тупик!
- Предложение "NOT IN" в LINQ to Entities
- Метод не может быть переведен в выражение хранилища
- Entity Framework: запрос дочерних объектов
- В LINQ для Entities поддерживаются только конструкторы и инициализаторы без параметров
- Сколько Include я могу использовать в ObjectSet в EntityFramework для сохранения производительности?
- Linq to Entities соединяются с groupjoin
- ASP.NET MVC 2.0 Реализация поиска в jqgrid
- Linq int to string
- LINQ to Entities не распознает метод
- Массовое удаление в LINQ для объектов
- Linq to Entities, случайный порядок
- Указанный член типа «Дата» не поддерживается в LINQ to Exities Exception
Вот краткий обзор различных методов:
-
Найти () – если вы хотите получить элемент по первичному ключу. Это вернет 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).