Различаются между DbContext.Find () и DbContext.SingleOrDefault () Entity Framework Core - PullRequest
0 голосов
/ 31 октября 2018

Чем отличается запрос данных из контекста с использованием Find() и Single(). Оба возвращают запрашиваемую сущность.

Некоторые примеры, которые я обнаружил в Microsoft, используют варианты Single, SingleOrDefault для запроса сущности. Некоторые используют Find метод.

Есть ли какие-либо "преимущества" производительности при использовании одного над другим?

1 Ответ

0 голосов
/ 31 октября 2018

Хотя они выглядят одинаково, они сильно отличаются в некоторых фундаментальных отношениях

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

Документация - ваш друг

Метод DbSet.Find

Находит сущность с заданными значениями первичного ключа. Если сущность с данные значения первичного ключа существуют в контексте, то это вернулся сразу, не сделав запрос в магазин. Иначе, в магазин поступает запрос на объект с указанным основным ключевые значения, и этот объект, если он найден, присоединяется к контексту и вернулся. Если в контексте или хранилище не найдено ни одного объекта, тогда null возвращается.

Queryable.SingleOrDefault Method

Возвращает один конкретный элемент последовательности или значение по умолчанию если такой элемент не найден.

Queryable.FirstOrDefault Метод

Возвращает первый элемент последовательности или значение по умолчанию, если нет элемент найден.

Больше-так

Запрос и поиск объектов

Метод Find в DbSet использует значение первичного ключа, чтобы попытаться найти сущность, отслеживаемая контекстом. Если объект не найден в контекст, то запрос будет отправлен в базу данных, чтобы найти сущность там. Null возвращается, если объект не найден в контексте или в базе данных.

Поиск отличается от использования запроса двумя существенными способами:

  • Обход в базу данных будет осуществляться только в том случае, если объект с данным ключом не найден в контексте.
  • Find будет возвращать сущности, которые находятся в состоянии добавлено. То есть Find вернет сущности, которые были добавлены в контекст, но не еще был сохранен в базе данных.

Update

Означает ли это, что если права уже отслеживались (через ленивая загрузка), тогда Find на самом деле будет иметь лучшую производительность Advantange при попытке запроса снова?

Да, это будет иметь лучшую производительность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...