Я ' У меня дьявольское время, когда я нахожу сравнение различных способов запроса одного элемента и времени использования каждого из них.
Есть ли у кого-нибудь ссылка, которая сравнивает все это, или краткое объяснение того, почему вы будете использовать один над другим? Есть ли еще операторы, о которых я не знаю?
Спасибо.
Вот обзор различных методов:
Find () - когда вы хотите получить элемент по первичному ключу. Это вернет null, если не сможет найти элемент. Он будет смотреть в контексте перед переходом к базе данных (как указал Ярон в комментариях), что может быть важным фактором эффективности, если вам нужно получить одну и ту же сущность несколько раз, пока жив один и тот же контекст.
Single () - когда вы ожидаете, что запрос вернет ровно один элемент. Это вызовет исключение, если запрос не вернет ровно один элемент.
SingleOrDefault () - когда вы ожидаете, что запросом будет возвращен ноль или один элемент (т.е. вы не уверены, существует ли элемент с данным ключом). Это вызовет исключение, если запрос не вернет ни одного элемента.
First () - когда вы ожидаете, что один или несколько элементов будут возвращены запросом, но вы хотите получить доступ только к первому элементу в вашем коде (здесь порядок может быть важен в запросе). Это вызовет исключение, если запрос не вернет хотя бы один элемент.
FirstOrDefault () - когда вы ожидаете, что запросом будет возвращено ноль или более элементов, но вы хотите получить доступ только к первому элементу в вашем коде (т. Е. Вы не уверены, существует ли элемент с данным ключом)
Это действительно очень просто: Single
возвращает один элемент и генерирует исключение, если их нет или больше одного элемента. Сначала
вернет первый элемент или выбрасывает, если его нет. FirstOrDefault
вернет первый элемент или значение по умолчанию (которое равно null
в случае, если данный тип является ссылочным типом) при отсутствии элемента.
Это то поведение, которым должен обладать API. Однако обратите внимание, что базовая реализация может иметь другое поведение. Хотя Entity Framework этому подчиняется, O / RM, например LLBLGen, также может возвращать null
при вызове First
, что очень странно. Это было очень странное (и упорное) решение дизайнера IMO.
У каждого из четырех методов есть свое место; Хотя на самом деле у вас всего две разные операции.
Версия xxxxOrDefault () просто добавляет: «Я не хочу рассматривать пустой набор результатов как исключительное обстоятельство».
Я всегда использую FirstOrDefault
. Если вы действительно хотите придирчиво к производительности, вам следует использовать FirstOrDefault
в EF. Скрытые SingleOrDefault
использует top (2) в запросе, потому что ему необходимо проверить, есть ли вторая строка, которая соответствует критериям, и, если это так, выдает исключение. Обычно в SingleOrDefault
вы говорите, что хотите вызвать исключение, если ваш запрос возвращает более 1 записи.