2014-01-21 2 views
1

Я заметил, что при использовании шаблона представления действий чтения/записи в MVC, создающем контроллер на основе модели, которая поддерживает отношения с другими таблицами (или сама по себе, не имеет значения), она автоматически реализует индекс действий с использованием Include так:Значимость использования Linq Включить при загрузке другой записи в таблице

 public ActionResult Index() 
    { 
     var table1 = db.Table1.Include(l => l.Parent).Include(l => l.Table2); 
     return View(table1.ToList()); 
    } 

Я думал, что это используется, так что, когда индекс нагрузки, вид будет включать в себя все модели поля (за исключением ID, конечно) вместе с иностранного таких как «Родитель» или «Таблица 2», которые, как представляется, имеют наибольший смысл.

Однако, я удалил включаемые части, как так:

 public ActionResult Index() 
    { 
     var table1 = db.Table1; 
     return View(table1.ToList()); 
    } 

и индекс по-прежнему загружены иностранные поля (Parent и TABLE2), как если бы включать пункт не нужен.

Мой вопрос: в чем смысл использования Include в этой конкретной ситуации (когда MVC загружает шаблон), а также в целом?

+0

Это не кажется правильным ... вы уверены, что тестируете новый код? –

ответ

2

Если вы используете Entity Framework, Include() сообщает EF, что эти отношения должны быть включены в запрос, чтобы сгенерированы соответствующие объединения. Это означает, что поля от Parent и Table2 будут включены в итоговый результат с одиночным обращением к отправке на сервер. (Это также известно как нетерпеливой загрузка)

Однако, если вы удалите Include() заявление, EF только вначале загрузки поле из Table. Однако он имеет lazy-loading включен по умолчанию, поэтому поля из Parent и Table2 извлекаются из базы данных при попытке получить к ним доступ. Это, однако, приведет к одному дополнительным обратным рейсам к серверу за дополнительные отношения.

Дополнительную информацию о параметрах, доступных для загрузки связанных объектов, можно получить в this entry сайта EF msdn.

Таким образом, если ваш индексный указатель использует поля из трех таблиц, для подхода Include() потребуется один обратный ход (с более тяжелым запросом), в то время как для подхода с ленивой загрузкой потребуется 3 обратных перехода.

Как правило, вы можете использовать Include(), если уверены, что вам понадобятся эти поля. Используйте ленивую загрузку, когда только в некоторых случаях вам нужны эти поля. В любом случае убедитесь, что вы проверяете раздел 8 this EF performance guide, он прекрасно объясняет оба варианта и его последствия, поэтому вы можете выбрать лучший для своих нужд.

Надеюсь, это поможет!

+0

Потрясающие сведения, спасибо! –

Смежные вопросы