Если я выберу из IQueryable, то включение будет потеряно

include не работает после того, как я выбираю запрос IQueryable. Есть ли способ обойти это? Мой запрос

public IQueryable<Network> GetAllNetworks()
{
    var query = (from n in _db.NetworkSet
                .Include("NetworkContacts.Contact")
                .Include("NetworkContacts.Contact.RelationshipSource.Target")
                .Include("NetworkContacts.Contact.RelationshipSource.Source")
                 select (n));        
    return query;;
}

Затем я пытаюсь заполнить свою ViewModel в моем слое WebUI, используя следующий код

            var projectedNetworks =
            from n in GetAllNetworks()
            select new NetworkViewModel
            {
                Name = n.Name,
                Contacts = from contact in networkList
                    .SelectMany(nc => nc.NetworkContacts)
                    .Where(nc => nc.Member == true)
                    .Where(nc => nc.NetworkId == n.ID)
                    .Select(c => c.Contact)                        
                    select contact,
            };

        return projectedNetworks;

Теперь проблема возникает в моем недавно созданном NetworkViewModel; объекты коллекции Contacts не содержат загруженных данных для RelationshipSource.Target или RelationshipSource.Source.

Однако данные есть при запуске из исходного метода репозитория IQueryable. Однако связанные данные include, похоже, не переносятся в новую коллекцию Contacts, которая создается, когда я использую файл Select New NetworkViewModel {}.

Есть ли способ сохранить эти данные Include, когда они будут переданы в новый объект? На данный момент я просто продолжаю получать Null исключений


person Connor Murphy    schedule 27.05.2010    source источник


Ответы (1)


Вот объяснение того, что происходит, и обходной путь.

Однако в вашем случае, я думаю, есть лучшее обходное решение, чем то, что описано в этой связанной статье. Вы уже используете модель представления для Network. Это хорошо! Сделайте это и для контакта (и связанных с ним свойств), и ваши проблемы с жадной загрузкой волшебным образом исчезнут. Проекция всегда работает.

person Craig Stuntz    schedule 28.05.2010
comment
Привет, Крейг. Спасибо за комментарий и ссылку. Где я должен использовать ContactViewModel. Вы предлагаете мне сделать проекцию внутри проекции? Это возможно? - person Connor Murphy; 29.05.2010