Нет, они оба должны приводить к одному и тому же запросу SQL при выполнении.Вы можете доказать это, заглянув в SQL Profiler и посмотрев, какой именно SQL-запрос отправляется из EF в обоих случаях.Ваша оптимизация производительности должна была быть вызвана некоторыми другими факторами.И вот почему:
Включить метод возвращает ObjectQuery :
public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
IQueryable<T>, IEnumerable<T>,
IOrderedQueryable, IQueryable,
IEnumerable, IListSource
Что означает его FirstOrDefault метод поставляется с 2 перегрузками:
// Defined by Enumerable:
FirstOrDefault(Func<T, Boolean>)
// Defined by Queryable:
FirstOrDefault(Expression<Func<T, Boolean>>)
Когда вы кодируете .FirstOrDefault(x => x.Customer.CustomerId == 1
, компилятор перейдет в процесс под названием Разрешение перегрузки для выводатип лямбда-выражения x => x.Customer.CustomerId == 1
, поскольку он может быть преобразован в тип обоих типов параметров перегрузки.Компилятор будет использовать алгоритм (который я все еще пытаюсь найти в C # Language Specification!), Выяснить, что преобразование лямбды в Expression<Func<T, Boolean>
является лучшим преобразованием , чем в Func<T, Boolean>
, поэтому выберите перегрузку IQueryable .
Следовательно, вы увидите предикат в сгенерированном SQL при его наблюдении в SQL Profiler.