2010-09-14 117 views
0

我是LINQ和实体框架的新手,很难提出一个合适的查询。LINQ to Entities多对多关系

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

联系 诠释的ContactID(PK), 字符串名称, 字符串EMAILADDRESS

项目 诠释专案编号(PK)

ProjectContact 诠释专案编号(PK), 诠释ContactId(PK), 布尔型IsPrimaryContact, 布尔型IsSecondaryContact

项目可以有1..n个联系人,其中之一是该项目的主要联系人。此外,如果项目有多个联系人,则其中一个联系人可以是该项目的辅助联系人。

联系人可以与许多项目关联,并且可能是多个项目的主要或次要联系人。

我需要为每个具有主要和次要联系人共享组合的项目组生成电子邮件。这个想法是,电子邮件的收件人字段包含主要联系人的电子邮件地址,抄送字段包含辅助联系人的电子邮件地址(如果有辅助联系人),并且电子邮件的正文包含所有具有此组合的项目的详细信息的主要和次要联系人。

我想填充包含对象的结构如下列表:

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

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 
            } 
        }; 
+0

感谢。这使我更接近我需要的东西。主要和次要联系人以及项目都有一些我需要访问的关联实体。联系人具有组织对象的导航属性和电话号码列表的导航属性。项目具有对Region对象和ProjectItems列表的引用。我怎样才能有效地将这些数据存入内存?我是EF3.5,所以我相信懒加载不是一个选项?对不起,如果我对术语有点不了解,我仍然在学习这个框架的内容。 – lukeck 2010-09-15 13:12:35

+0

3.5(和4)中简单的做法是将EmailDetails.Projects更改为IEnumerable (即视图或编辑模型,而不是实体)并将其投影到该项上。我会更新这个例子。 – 2010-09-15 13:33:27

+0

谢谢。这工作,但有没有办法做到这一点,不需要创建ProjectDetails和ContactDetails类?我希望能够通过导航属性访问该区域和ProjectItems。感觉就像不需要创建新的数据结构来访问相关对象一样。 – lukeck 2010-09-15 14:03:27