2016-04-02 44 views
0

我对使用T-SQL/SQL Server相当陌生,而且我不确定如何使用Linq获得期望的结果。如何对结果进行分组并删除重复项

从下面的代码,我得到如下结果:

from com in Complaints 
    join pro in Projects on com.ProjectId equals pro.ProjectId 
    join cont in Contacts on com.SubContractorContactId equals cont.ContactId 
    join cont2 in Contacts on com.OccupantContactId equals cont2.ContactId 
    where com.EmailStatusId == null 
    select new 
       { 
        pro.ProjectName, 
        com.ComplaintId, 
        com.ComplaintName, 
        SubContractorName = cont.FirstName, 
        SubContractorEmail = cont.Email, 
        com.DueDate, 
        OccupantName = cont2.FirstName, 
        OccupantPhone = cont2.Phone, 
        OccupantEmail = cont2.Email 
       } 

Linq results

我想结果与其中列出的每个投诉返回一个不同的项目。此外,我希望在投诉中对每个联系人进行分组,同时删除重复内容。因此,对于每个项目,我希望得到的结果是单行的,然后是项目内的每个投诉,并在每个投诉联系人内。

为了帮助您理解我创建了这个大纲。

Projects 
- Lake Road Construction 
    - Complaints 
     - Foundation Cracks: ComplaintId 1, DueDate 
      - Contacts 
       - SubContractor 
        - Carlo 
        - [email protected] 
       - Occupant 
        - William 
        - [email protected] 
        - 616-846-0467 
     - Drywall: ComplaintId 2, DueDate 
      - Contacts 
       - SubContractor 
        * No SubContractor needed since the previous complaint has the same SubContractor. 
       - Occupant 
        - Keesha 
        - [email protected] 
        - 661-205-2018 

- Jennifer Lane Renovation 
    - Complaints 
     - Light Fixture: ComplaintId 3, DueDate 
      - Contacts 
       - SubContractor 
        - Ardith 
        - [email protected] 
       - Occupant 
        - Olivia 
        - [email protected] 
        - 210-530-5281 
     - Plumbing: ComplaintId 4, DueDate 
      - Contacts 
       * Contacts have already been collected from the other complaint. 

从我读过的内容看,我认为我需要使用“group by new {}”或使用UNION。不过,我不确定我需要的方向。任何帮助将不胜感激。

回答

2

这应该根据ProjectName对您的数据进行分组。结果是具有Project属性和Complaints属性的匿名对象的列表。在Complaints财产的每个项目都有一个CompIdContact财产

var groupedResults = (from co in Complaints 
    join p in Projects on co.ProjectId equals p.ProjectId 
    join cont in Contacts on co.SubContractorContactId equals cont.ContactId 
    join cont2 in Contacts on co.OccupanttContactId equals cont2.ContactId 
      select new 
      { 
       ProjecttName = p.Name, 
       ComplaintId = co.Id,         
       SubContractorName = cont.FirstName, 
       OccupantName = cont2.FirstName 
       // Fill the other properties here please         
      } 
).GroupBy(k => k.ProjecttName, i => i, (x, b) => new 
{ 
    Project=x, 
    Complaints =b.Select(d=> new 
    { 
     CompId=d.ComplaintId, 
     Contacts=new { SubContr=d.SubContractorName, Occupant = d.OccupantName} 
    }) 
}).ToList(); 
+0

你是一个生命的救星!我从来没有想过这样做。看起来我需要刷新我的Linq/Lambda。 –