LINQ для сущностей отношения многие ко многим - PullRequest
0 голосов
/ 14 сентября 2010

Я новичок в LINQ и Entity Framework, и мне не удается найти подходящий запрос.

У меня есть следующие лица. Я включил первичные ключи и некоторые другие соответствующие поля.

Контакт Int ContactId (PK), Строковое имя, Строка EMailAddress

Project Int ProjectId (PK)

ProjectContact Int ProjectId (PK), Int ContactId (PK), Boolean IsPrimaryContact, Boolean IsSecondaryContact

Проект может иметь 1..n контакты, один из которых является основным контактом для этого проекта. Кроме того, если в проекте имеется более одного контакта, один из других контактов может быть дополнительным контактом для этого проекта.

Контакт может быть связан со многими проектами и может быть основным или вторичным контактом для нескольких проектов.

Мне нужно создать электронное письмо для каждой группы проектов, в которых есть общая комбинация основного и дополнительного контактов. Идея заключается в том, что поле «Кому» электронной почты содержит адрес электронной почты основного контакта, поле «CC» содержит адрес электронной почты дополнительного контакта (если есть дополнительный контакт), а тело письма содержит сведения обо всех проектах, в которых есть эта комбинация. первичных и вторичных контактов.

Я хотел бы заполнить список, содержащий объекты со следующей структурой:

class EmailDetails
{
    public Contact PrimaryContact;
    public Contact SecondaryContact;
    public IEnumerable<Project> Projects = new List<Project>();
}

Пока у меня есть это:

var QueryResults =
    from project in ProjectSet
        join primaryContact in ProjectContacts on project.ProjectId equals primaryContact.ProjectId where primaryContact.IsPrimary
        join secondaryContact in ProjectContacts on project.ProjectId equals secondaryContact.ProjectId where secondaryContact.IsSecondary
        select new {primaryContact, secondaryContact, project}

Куда мне идти отсюда?

Спасибо.

1 Ответ

1 голос
/ 14 сентября 2010

Редко правильно использовать join в L2E / L2S .Вместо этого используйте ассоциативные / навигационные свойства.

Вне головы (может потребоваться некоторая настройка):

var QueryResults = from project in ProjectSet
                   let p = project.Contacts.FirstOrDefault(c => c.IsPrimary)
                   let s = project.Contacts.FirstOrDefault(c => c.IsSecondary)
                   group project by new { Primary = p, Secondary = s } into g
                   select new EmailDetails
                   {
                       PrimaryContact = g.Key.Primary,
                       SecondaryContact = g.Key.Secondary,
                       Projects = from proj in g
                                  select new ProjectDetails
                                  {
                                      Project = proj,
                                      Region = proj.Region,
                                      ProjectItems = proj.ProjectItems
                                  }
                   };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...