Если я выберу из IQueryable, то Включить будет потеряно - PullRequest
9 голосов
/ 27 мая 2010

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 исключений

1 Ответ

7 голосов
/ 28 мая 2010

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

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

...