Entity Framework - вопрос ко многим - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть таблица ASB и таблица PeopleInvolved. Существует таблица соединений PeopleInvolved_ASB, которая просто содержит ASBID и столбец PeopleInvolvedID. Столбцы действуют как составной первичный ключ.

Конструктор не показывает соединительную таблицу (как и ожидалось). Я хочу получить список PeopleInvolved на основе ASBID.

Чтобы восстановить людей, я делаю это:

 // This top line gets the ASB record from the Case
 var asbRecord = (from c in dd.Case
                         where c.CaseID == caseID
                         select c.ASB).First();

        var asbID = asbRecord.Select(asb => asb.ASBID).First();

        var people = (from asb in dd.ASB
                      where asb.ASBID == asbID
                      select asb.PeopleInvolved);

Теперь я хочу добавить каждую запись PeopleInvolved в простой список типа PeopleInvolved. Я не могу сделать это все же. Я продолжаю получать:

Ошибка 4 Не удается преобразовать тип 'System.Data.Objects.DataClasses.EntityCollection' в 'Dynamic.PeopleInvolved'

Как я могу получить простой список PeopleInvolved в общий список, который я могу передать обратно своему контроллеру?

Спасибо

Ответы [ 3 ]

1 голос
/ 13 ноября 2009

Судя по сообщаемой вами ошибке, я предполагаю, что PeopleInvolved - это коллекция. Итак, попробуйте это:

    var people = (from asb in dd.ASB
                  where asb.ASBID == asbID
                  from pi in asb.PeopleInvolved
                  select pi).ToList();

Я думаю, что крайне сбивает с толку наличие типа с именем PeopleInvolved и коллекции этого типа с абсолютно одинаковым именем. Точно так же, похоже, у вас есть тип с именем ASB и набор сущностей, содержащий множество экземпляров этого типа с тем же именем,

Гораздо понятнее сделать множественные имена сущностей множественными, а имена типов единичными.

Если я угадал типы, пожалуйста, уточните расположение ASB и Dynamic.PeopleInvolveed.

1 голос
/ 13 ноября 2009

Это то, что вы хотите сделать?

 List<PeopleInvolved> genericPeopleInvolvedList = (from asb in dd.ASB
                          where asb.ASBID == asbID
                          select asb.PeopleInvolved).ToList();

[Обновлено: плохо ответили раньше]

Только что понял, что asb.PeopleInvolved - это коллекция, а не одна сущность (чёрт!). Итак, предыдущий запрос linq возвращает коллекцию сущностей PeopleInvolved. Поскольку вы выбираете по ASPID, должен быть только один asb.ASBID, который заполняет предложение asb.ASBID == asbID, и вы можете сделать следующее:

var listWithCollectionOfPeopleInvolved = (from asb in dd.ASB
                              where asb.ASBID == asbID
                              select asb.PeopleInvolved).ToList();

List<PeopleInvolved> peopleInvolved = listWithCollectionOfPeopleInvolved.First().ToList();

Но гораздо приятнее, если вы сделаете это с помощью Include:

var asbInstance = (from asb in dd.ASB.Include("PeopleInvolved")
                      where asb.ASBID == asbID
                      select asb).FirstOrDefault();
foreach(PeopleInvolved pi in asbInstance.PeopleInvolved)
{
//do your stuff
}

При включении автоматически загружать связанные свойства.

0 голосов
/ 05 августа 2010
List<PeopleInvolved> = new List<PeopleInvolved>(people);
...