Это выполнит задание:
session.cookies = LWPCookieJar('cookies.txt')
API CookieJar требует, чтобы вы вызывали load () и save () вручную, хотя. Если вам не нужен формат cookie.txt, у меня есть реализация ShelvedCookieJar , которая будет сохраняться при изменении.
Всякий раз, когда вы используете SingleOrDefault
, вы четко указываете, что запрос должен привести не более чем к одиночному результату. С другой стороны, когда используется FirstOrDefault
, запрос может возвращать любое количество результатов, но вы указываете, что вам нужен только первый.
Лично я считаю, что семантика очень отличается, и я использую подходящую. в зависимости от ожидаемых результатов улучшает читаемость.
В ваших случаях я будет использовать следующее:
select by ID == 5: здесь можно использовать SingleOrDefault, потому что вы ожидаете одну [или ни одной] сущности, если у вас более одной сущности с ID 5, что-то не так и определенно заслуживает исключения .
при поиске людей, чье имя равно "Бобби", их может быть больше одного (вполне возможно, я думаю), поэтому вам не следует использовать Single или First, просто выберите с помощью операции Where (если "Bobby "возвращает слишком много объектов, пользователь должен уточнить свой поиск или выбрать один из возвращенных результатов)
порядок по дате создания также должен выполняться с помощью операции Where (маловероятно, что будет только один объект,сортировка не принесет особого смысла;) однако это означает, что вы хотите, чтобы ВСЕ объекты были отсортированы - если вы хотите только ОДИН, используйте FirstOrDefault, Single будет генерировать каждый раз, если у вас более одного объекта.
Я использую SingleOrDefault
в ситуациях, когда моя логика подсказывает, что результатом будет либо ноль, либо единица. Если их больше, это ситуация с ошибкой, что полезно.
В вашем последнем примере:
var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or doesn't matter?
Да, это так. Если вы попытаетесь использовать SingleOrDefault ()
, а результат запроса будет больше, чем запись, вы получите исключение. Единственный раз, когда вы можете безопасно использовать SingleOrDefault ()
, - это когда вы ожидаете только 1 и только 1 результат ...
Существует
между ними.
Семантическая разница:
FirstOrDefault
возвращает первый элемент потенциально несколько (или по умолчанию, если ничего не существует). SingleOrDefault
предполагает, что существует один элемент, и возвращает его (или по умолчанию, если его нет). Наличие нескольких элементов является нарушением контракта, возникает исключение. Разница в производительности
FirstOrDefault
обычно выполняется быстрее, выполняется итерация до тех пор, пока не будет найден элемент, и требуется только выполнить итерацию всего перечислимого, когда она не найдет Это. Во многих случаях высока вероятность найти элемент.
SingleOrDefault
должен проверять, есть ли только один элемент, и поэтому всегда выполняет итерацию всего перечислимого. Точнее, он выполняет итерацию, пока не найдет второй элемент и не выдаст исключение. Но в большинстве случаев второго элемента нет.
Заключение
Используйте FirstOrDefault
, если вам все равно, сколько там предметов или , когда вы не можете себе позволить проверка уникальности (например, в очень большой коллекции). Когда вы проверяете уникальность при добавлении элементов в коллекцию, может быть слишком дорого проверять ее снова при поиске этих элементов.
Используйте SingleOrDefault
, если вам не нужно слишком заботиться о производительности и вы хотите убедиться, что предположение об отдельном элементе понятно читателю и проверено во время выполнения.
На практике , вы часто используете First
/ FirstOrDefault
, даже в тех случаях, когда вы предполагаете один элемент, чтобы повысить производительность.