我尝试结合两个结果集(LINQ /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 Edit 123乔吹新 234简·史密斯新 345无名氏新
我理解为什么会发生这种情况,但是是否有一种方法可以通过使用ID来进一步过滤这个结果集?
我希望返回一条记录,而Edit记录优于New记录。所以我只想要这个
123 Joe Blow Edit 234简·史密斯新 345无名氏新
发布于 2014-02-13 20:54:31
在这种情况下,正确的处理方法不是工会。它是使用一个左外部连接,而不是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")
};发布于 2014-02-13 20:49:50
您可以使用GroupBy按其ID对记录进行分组,并仅选择其中一个:
var results = ldrSet.Union(allEmpSet)
.GroupBy(item => item.ID, (key, items) =>
items.OrderBy(item => item.flag)
.FirstOrDefault());您可以更改OrderBy的内容以确定要选择的项。
https://stackoverflow.com/questions/21765138
复制相似问题