LINQ: когда использовать SingleOrDefault или FirstOrDefault () с критериями фильтрации

Это выполнит задание:

session.cookies = LWPCookieJar('cookies.txt')

API CookieJar требует, чтобы вы вызывали load () и save () вручную, хотя. Если вам не нужен формат cookie.txt, у меня есть реализация ShelvedCookieJar , которая будет сохраняться при изменении.

471
задан p.campbell 17 November 2009 в 02:24
поделиться

5 ответов

Всякий раз, когда вы используете SingleOrDefault , вы четко указываете, что запрос должен привести не более чем к одиночному результату. С другой стороны, когда используется FirstOrDefault , запрос может возвращать любое количество результатов, но вы указываете, что вам нужен только первый.

Лично я считаю, что семантика очень отличается, и я использую подходящую. в зависимости от ожидаемых результатов улучшает читаемость.

448
ответ дан 22 November 2019 в 22:43
поделиться

В ваших случаях я будет использовать следующее:

select by ID == 5: здесь можно использовать SingleOrDefault, потому что вы ожидаете одну [или ни одной] сущности, если у вас более одной сущности с ID 5, что-то не так и определенно заслуживает исключения .

при поиске людей, чье имя равно "Бобби", их может быть больше одного (вполне возможно, я думаю), поэтому вам не следует использовать Single или First, просто выберите с помощью операции Where (если "Bobby "возвращает слишком много объектов, пользователь должен уточнить свой поиск или выбрать один из возвращенных результатов)

порядок по дате создания также должен выполняться с помощью операции Where (маловероятно, что будет только один объект,сортировка не принесет особого смысла;) однако это означает, что вы хотите, чтобы ВСЕ объекты были отсортированы - если вы хотите только ОДИН, используйте FirstOrDefault, Single будет генерировать каждый раз, если у вас более одного объекта.

4
ответ дан 22 November 2019 в 22:43
поделиться

Я использую SingleOrDefault в ситуациях, когда моя логика подсказывает, что результатом будет либо ноль, либо единица. Если их больше, это ситуация с ошибкой, что полезно.

10
ответ дан 22 November 2019 в 22:43
поделиться

В вашем последнем примере:

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or doesn't matter?

Да, это так. Если вы попытаетесь использовать SingleOrDefault () , а результат запроса будет больше, чем запись, вы получите исключение. Единственный раз, когда вы можете безопасно использовать SingleOrDefault () , - это когда вы ожидаете только 1 и только 1 результат ...

3
ответ дан 22 November 2019 в 22:43
поделиться

Существует

  • семантическая разница
  • разница в производительности

между ними.

Семантическая разница:

  • FirstOrDefault возвращает первый элемент потенциально несколько (или по умолчанию, если ничего не существует).
  • SingleOrDefault предполагает, что существует один элемент, и возвращает его (или по умолчанию, если его нет). Наличие нескольких элементов является нарушением контракта, возникает исключение.

Разница в производительности

  • FirstOrDefault обычно выполняется быстрее, выполняется итерация до тех пор, пока не будет найден элемент, и требуется только выполнить итерацию всего перечислимого, когда она не найдет Это. Во многих случаях высока вероятность найти элемент.

  • SingleOrDefault должен проверять, есть ли только один элемент, и поэтому всегда выполняет итерацию всего перечислимого. Точнее, он выполняет итерацию, пока не найдет второй элемент и не выдаст исключение. Но в большинстве случаев второго элемента нет.

Заключение

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

  • Используйте SingleOrDefault , если вам не нужно слишком заботиться о производительности и вы хотите убедиться, что предположение об отдельном элементе понятно читателю и проверено во время выполнения.

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

235
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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