Как вы создаете запрос LINQ to Entities для непосредственного загрузки дочерних объектов, вместо вызова свойства Reference или Load()

Я новичок в использовании LINQ to Entities (или Entity Framework независимо от того, что они называют), и я пишу много кода:

var item = (from InventoryItem item in db.Inventory
            where item.ID == id
            select item).First<InventoryItem>();

а затем вызывать методы для этого объекта следующим образом:

var type = item.ItemTypeReference;

или

var orders = item.OrderLineItems.Load();

для извлечения дочернего или связанных объектов.

Я не профилировал DB или не вырыл слишком глубоко, но я предполагаю, что когда я вызываю свойство .Load() или * Reference, я на самом деле делаю другой вызов в БД. Если это так, есть ли способ получить эти объекты в моем первоначальном выражении LINQ?

Ответ 1

Вы хотите использовать ссылки метода .Include(string) в этом "Shaping results results" .

var item = from InventoryItem item in
              db.Inventory.Include("ItemTypeReference").Include("OrderLineItems")
           where item.ID == id
           select item;

Существует, вероятно, синтаксис стиля "sql" для Includes.

Также см. статью о перемещении из LINQ-to-SQL в LINQ-to-Entities.

Для других, которые ищут решение этой проблемы для Linq to SQL, вы хотите сделать следующее (замените DataContext и другие типы для всего, что у вас есть):

using (DataContext db = new DataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
    options.LoadWith<InventoryItem>(ii => ii.OrderLineItems);
    db.LoadOptions = options;

    var item = from InventoryItem item in db.Inventory
               where item.ID == id
               select item;
}

Это загрузит свойства, указанные в LoadWith, когда будет загружен родительский элемент (InventoryItem) для этого конкретного контекста.

В ответ на некоторые дополнительные вопросы Джеймса и Йеспера, посмотрите question

Ответ 2

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

Entity Framework.Include() с проверкой времени компиляции?

Ответ 3

AFAIK, Для silverlight (услуги домена) добавление атрибута [Include] в нужное место (над навигационным свойством в метаданных) достаточно fooobar.com/info/45942/...