Where().First против Find()

#.net #entity-framework-core

#.net #сущность-фреймворк-ядро

Вопрос:

Я использую EF Core и сомневаюсь в том, какое решение является наиболее эффективным?

Решение 1:

 _dbContext.View.Find(topicId);
  

Решение 2:

 _dbContext.View.Where(v => v.TopicId.Equals(topicId)).First();
  

Решение 1 очень простое для понимания. Найдите первый результат и верните. Но как насчет решения 2? Будет ли он выполнять поиск по всей базе данных с помощью функции Where, а затем возвращать первый результат в списке. Или это будет принято во внимание в первую очередь и прекратит поиск по базе данных, когда будет найден первый результат?

Комментарии:

1. В этом смысл IQueryable<T> и IEnumerable<T> — они оба предназначены для ленивого поиска решения, не выполняя слишком много работы. IQueryable<T> преобразует выражение в один оператор SQL, который возвращает только одно значение. IEnumerable<T> лениво перебирает коллекцию по одному элементу за раз, поэтому .First() немедленно останавливает итерацию, когда .Where выдает первое значение.

Ответ №1:

В этом смысл IQueryable<T> и IEnumerable<T> — они оба предназначены для ленивого поиска решения, не выполняя слишком много работы.

IQueryable<T> преобразует выражение в один (надеюсь, но не всегда) оператор SQL, который возвращает только одно значение.

IEnumerable<T> лениво перебирает коллекцию по одному элементу за раз, поэтому .First() немедленно останавливает итерацию, когда .Where(...) выдает первое значение.