我有两个我想要结合的结果集(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
答案 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
的内容以确定要选择的项目。