LINQ实体有很多很多关系

时间:2010-09-14 06:20:09

标签: linq entity-framework linq-to-entities

我是LINQ和实体框架的新手,我在找到合适的查询时遇到了麻烦。

我有以下实体。我已经包含了主键和其他一些相关字段。

Int ContactId(PK), 字符串名称, 字符串EMailAddress

项目 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 个答案:

答案 0 :(得分:1)

It's rarely correct to use join in 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
                                  }
                   };