Я заметил, что в зависимости от того, как я извлекаю данные из моей модели Entity Framework, я получаю разные типы результатов. Например, при получении списка сотрудников в конкретном отделе:Entity Framework - запрос из ObjectContext vs Querying from Navigation Property
Если я тяну непосредственно из 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 предупреждений при использовании последнего метода, но ни когда не используя прямые запросы. Я использую последний метод чаще, просто потому, что писать гораздо чище, и мне интересно, действительно ли это на самом деле оказало пагубное влияние!
Спасибо за это. Должен ли я вообще избегать навигационных свойств при использовании в этом контексте или это было бы эквивалентно просто для того, чтобы я вызывал CreateSourceQuery() для перечислимых свойств навигации? – Ross
Как только вы используете 'CreateSourceQuery', вы снова используете IQueryable, который в порядке. Сами свойства навигации не предназначены для запросов. Они предназначены для работы со связанными объектами. –
Является ли свойство навигации имеющими какие-либо преимущества перед выполненными запросами для фильтрации? – ManirajSS