Можно ли загрузить навигационное свойство коллекции сущностей?

У меня есть запрос, который вернет массив таких сущностей:

var collection = db.Items.ToArray();

Можно ли теперь загружать связанные данные из этих элементов сразу (без использования ленивой загрузки):

Вот класс сущности:

public class Item
{
    public int Id { get; set; }

    public virtual SecondaryItem Secondary { get; set; }
}

Мне нужно загрузить каждый вторичный элемент в моем collection ПОСЛЕ того, как я получил основные элементы в массиве, поэтому я не могу использовать метод Include в исходном запросе.

Это возможно?

Изменить. Я имею в виду, что предпочел бы загружать их все одним запросом, а не по одному.


person Dismissile    schedule 21.03.2012    source источник
comment
Пожалуйста, объясните, почему вы не можете использовать Include. Из вашего примера это ограничение кажется искусственным.   -  person Vladimir Perevalov    schedule 21.03.2012
comment
Это упрощенный пример, но в основном в реальном запросе у меня возникают некоторые проблемы с производительностью запроса, когда у меня есть Include из-за соединений, которые он использует.   -  person Dismissile    schedule 21.03.2012


Ответы (2)


Просто запустите следующее:

db.Items.Select(x => x.SecondaryItem).Distinct().Load();

DbContext позаботится об инициализации всех существующих ссылок Item.SecondaryItem соответствующими объектами.

Обратите внимание, что решение Дуэйна тоже сработает; это просто немного более оптимизировано.

person Diego Mijelshon    schedule 21.03.2012
comment
Что это за метод загрузки, на который вы ссылаетесь? В каком пространстве имен он находится? - person Dismissile; 21.03.2012
comment
Это метод расширения: добавьте using System.Data.Entity; - person Diego Mijelshon; 21.03.2012
comment
Не карта удостоверений обеспечивает установку свойства навигации, а исправление отношения вместе с промежутком отношения: blogs.msdn.com/b/alexj/archive /2009/04/03/ - person Slauma; 21.03.2012

Повторная попытка, основанная на комментарии. Можете ли вы просто получить их все вторым запросом?

var itemIds = collection.Select(i => i.ID);
var query = from s in db.SecondaryItems 
            where itemIds.Contains(s.ItemID) 
            select s;
person Duane Theriot    schedule 21.03.2012
comment
Первый код — у меня нет свойства IsLoaded или метода Load(). - person Dismissile; 21.03.2012
comment
Проблема в том, что он не устанавливает навигационные свойства моих исходных объектов. Может быть, будет безопасно, если я сделаю эту часть вручную? Я не уверен? - person Dismissile; 21.03.2012
comment
@Dismissile: Поскольку в комментарии к вашему вопросу вы говорили о проблемах с производительностью, будьте осторожны с использованием Contains. Для длинных коллекций это также известный убийца производительности. Однако он будет работать, а также автоматически установит свойства навигации (см. Ответ Диего и ссылку в моем комментарии под его ответом). - person Slauma; 21.03.2012