Linq to Sql Union声明

时间:2014-02-13 20:46:56

标签: c# linq

我有两个我想要结合的结果集(LINQ to SQL / Entity)

var ldrSet = (from ldr in Leader
              join emp in employee
              on ldr.ID equals emp.ID
              where ldr.ID.Contains("123")
     select new {ID = ldr.ID, Name = emp.firstName + " " + emp.lastName, flag = "Edit"});

var allEmpSet = (from emp in employee
                 where emp.ID.Contains("123")
     select new {ID = ldr.ID, Name = emp.firstName + " " + emp.lastName, flag = "New"});

var results = ldrSet.Union(allEmpSet);

当我运行此查询时,我得到类似这样的内容:

  

123 Joe Blow编辑

     

123 Joe Blow New

     

234 Jane Smith New

     

345 John Doe New

我理解为什么会发生这种情况,但有没有办法通过使用ID进一步过滤此结果集?

我希望返回一条记录,Edit记录胜过New记录。所以我只想要这个:

  

123 Joe Blow编辑

     

234 Jane Smith New

     

345 John Doe New

2 个答案:

答案 0 :(得分:3)

在这种情况下处理事情的正确方法不是联盟。它是使用左外连接而不是LINQ默认的内连接。这样您就可以一次选择所有行,如果数据匹配得恰当,则设置flag

var results = from e in employee
              join l in leaders on l.ID equals e.ID into ls
              from l in ls.DefaultIfEmpty()
              select new { 
                  e.ID, 
                  Name = e.firstName + e.lastName,
                  flag = (p == null ? "New" : "Edit")
              };

答案 1 :(得分:2)

您可以使用GroupBy按照ID分组记录,只选择其中一个:

var results = ldrSet.Union(allEmpSet)
    .GroupBy(item => item.ID, (key, items) => 
        items.OrderBy(item => item.flag)
        .FirstOrDefault());

您可以更改OrderBy的内容以确定要选择的项目。