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

Я новичок в использовании 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();

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

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

Ответы [ 3 ]

61 голосов
/ 25 ноября 2008

Вы хотите использовать ссылки на метод .Include (string) в этой статье "Формирование результатов запроса" .

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

Вероятно, есть синтаксис в стиле "sql" и для включений.

Также см. Эту статью о переходе с 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), для этого конкретного контекста.

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

0 голосов
/ 23 марта 2013

AFAIK, Для silverlight (доменные службы) достаточно добавить атрибут [Include] в нужное место (свойство навигации в метаданных) https://stackoverflow.com/a/5332188/413032

0 голосов
/ 08 марта 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...