Как вы создаете запрос 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/...