#.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(...)
выдает первое значение.