Linq Union,避免空值和重复数据

时间:2018-04-23 06:03:42

标签: c# linq union

我正在尝试编写一个linq查询来合并2个集合,它将在下面解释:

public class VoteData
{
    public string Name{get;set;}
    public string VoteFunction  {get;set;}
    public string Area {get;set;}
    public string Sector {get;set;}
    public string Email {get;set;}
    public string VoterEmail {get; set;}
}

public class DirectoryData
{ 
   public string VoteFunction  {get;set;}
   public string Area {get;set;}
   public string Sector {get;set;}
   public string PrimaryEmail {get;set;}    
   public string VoterEmail {get; set;}

}

Linq查询:

 var result = (from r in voteList select new { r.Email, r.Area, r.Sector, r.VoteFunction }).Union
              (from d in directoryDataList select new { Email = d.PrimaryEmail, d.Area, d.Sector, d.VoteFunction });

现在假设此查询返回如下结果:

No  Email        Area        Sector      VoteFunction  Voter Email
======================================================================
1.  abc@gmail    USA         IT          Sales         voter2@gmail
2.  abc@gmail    Null        IT          Analyst       voter2@gmail
3.  abc@gmail    USA         IT          null          voter2@gmail
4.  abc@gmail    Europe      Tech        null          voter2@gmail
5.  abc@gmail    Europe      Accounts    Analyst       voter2@gmail
6.  abc@gmail    Europe      null        Analyst       voter2@gmail
7.  abc@gmail    USA         IT          null          voter1@gmail
======================================================================

还有一个字段VoterEmail。所以基本上,我想计算每AreaSectorVoteFunction的投票数。 现在在上面的结果中,我想排除结果no 3和结果no 6.结果no 3因为它有面积和扇区,对于同一个选民也存在于结果1中,而我仍然希望保持结果no 7因为它有不同的选民。类似于结果no 6,它具有area和voteFunction,它也出现在结果no 5中。

对此有任何解决方案吗?

1 个答案:

答案 0 :(得分:0)

所以你想为(Area,Sector,Voter email)制作具有相同值的项目组。如果这些组中的任何一个包含多个项目,那么显然您有多个具有相同值的对象(区域,扇区,选民电子邮件),并且您只想保留其中一个。

你说你想要排除没有3,因为它与没有1的值相同。同样地,我可以说我想排除没有1,因为它具有与3相同的值。你关心它是1还是3 ,或者我可以选择其中任何一个?

var finalResult = unionResult
    .GroupBy(item => new     // make groups of items with same Area / Sector / VoterEmail
    {
        Area = item.Area,
        Sector = item.Sector,
        VoterEmail = item.VoterEmail,
    });
    // all items in every group have the same Area/Sector/VoterEmail
    .Select (group => group.First()); // from every group take the first one
相关问题