Я заметил, что в зависимости от того, как я извлекаю данные из моей модели Entity Framework, я получаю разные типы результатов. Например, при получении списка сотрудников в определенном отделе:
Если я получаю напрямую из ObjectContext, я получаю IQueryable<Employee>
, который на самом деле System.Data.Objects.ObjectQuery<Employee>
:
var employees = MyObjectContext.Employees.Where(e => e.DepartmentId == MyDepartment.Id && e.SomeCondtition)
Но если я использую свойство навигации MyDepartment, я получу IEnumerable<Employee>
, что на самом деле System.Linq.WhereEnumerableIterator<Employee>
(закрытый класс в System.Linq.Enumerable):
var employees = MyDeparment.Employees.Where(e => e.SomeCondtition)
В следующем коде я интенсивно использую employees
в нескольких запросах LINQ (Where
, OrderBy
, First
, Sum
и т. Д.)
Должен ли я учитывать, какой метод запроса я использую? Будет ли разница в производительности? Использует ли последний отложенное исполнение? Является ли одна лучшая практика? Или это не имеет значения?
Я спрашиваю об этом, потому что с момента установки ReShaper 6 я получаю много возможных многократных перечислений предупреждений IEnumerable при использовании последнего метода, но ни одного при использовании прямых запросов. Я использую последний метод чаще, просто потому, что писать гораздо чище, и мне интересно, действительно ли это дало отрицательный эффект!