Entity Framework - Пропуск объектов на пути навигации - PullRequest
0 голосов
/ 20 октября 2011

У меня есть три сущности, основанные на 3 таблицах БД (количество элементов под отношениями).

Pupil - SchoolClass - ClassType
     N:1           1:1

Я хочу получить список учеников и обновить их скалярное свойство Grade.Оценка зависит от типа класса, который посещает ученик.Поэтому мне также нужен ClassType для каждого ученика.

Вот что я делаю:

var pupils = from pupil in db.Pupils.Include("SchoolClass.ClassType")
             select pupil;

foreach(Pupil p in pupils)
    p.Grade *= p.SchoolClass.ClassType.GradingFactor;

Проблема в том, что SchoolClass загружается в контекст со всеми скалярными свойствамизаполнено (+ идентификаторы внешнего ключа).

Есть ли способ пропустить объект между объектами Pupil и ClassType?То есть загружать только свойство навигации ClassCype SchoolClass?

Загрузка желаемого числа учеников без включения была 20 мс, а с включением - 250 мс.Мне интересно, если это можно оптимизировать?

1 Ответ

1 голос
/ 20 октября 2011

Загрузка нужного количества учеников без включения была просто выбором на 1 таблицу без сегментации или сортировки, если я правильно понял ваш запрос.Это конечно быстрее.

Теперь вы загружаете все свойства навигации.Это какая-то работа.Задумывались ли вы только о выборе Ученика и его GradingFactor?

var pupils = from pupil in db.Pupils 
             select new
             {
                Pupil = pupil,
                GradingFactor = pupil.SchoolClass.ClassType.GradingFactor
             }; 

Еще одним оптимальным вариантом было бы объединить SchoolClass и ClassType вместе, поскольку их отношения 1: 1 (согласно вашей спецификации), сохраняя вам 1 присоединение

...