Хотя они выглядят одинаково, они сильно отличаются в некоторых фундаментальных отношениях
Короче говоря, Find
начинается с поиска в локальном кеше контекста. Если совпадений не найдено, он отправляет запрос в базу данных.
Документация - ваш друг
Метод DbSet.Find
Находит сущность с заданными значениями первичного ключа. Если сущность с
данные значения первичного ключа существуют в контексте, то это
вернулся сразу, не сделав запрос в магазин. Иначе,
в магазин поступает запрос на объект с указанным основным
ключевые значения, и этот объект, если он найден, присоединяется к контексту и
вернулся. Если в контексте или хранилище не найдено ни одного объекта, тогда null
возвращается.
Queryable.SingleOrDefault Method
Возвращает один конкретный элемент последовательности или значение по умолчанию
если такой элемент не найден.
Queryable.FirstOrDefault Метод
Возвращает первый элемент последовательности или значение по умолчанию, если нет
элемент найден.
Больше-так
Запрос и поиск объектов
Метод Find в DbSet использует значение первичного ключа, чтобы попытаться найти
сущность, отслеживаемая контекстом. Если объект не найден в
контекст, то запрос будет отправлен в базу данных, чтобы найти сущность
там. Null возвращается, если объект не найден в контексте или
в базе данных.
Поиск отличается от использования запроса двумя существенными способами:
- Обход в базу данных будет осуществляться только в том случае, если объект с данным ключом не найден в контексте.
- Find будет возвращать сущности, которые находятся в состоянии добавлено. То есть Find вернет сущности, которые были добавлены в контекст, но не
еще был сохранен в базе данных.
Update
Означает ли это, что если права уже отслеживались (через
ленивая загрузка), тогда Find на самом деле будет иметь лучшую производительность
Advantange при попытке запроса снова?
Да, это будет иметь лучшую производительность