首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq to Sql Union语句

Linq to Sql Union语句
EN

Stack Overflow用户
提问于 2014-02-13 20:46:55
回答 2查看 228关注 0票数 1

我尝试结合两个结果集(LINQ /Entity)

代码语言:javascript
复制
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无名氏新

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 20:54:31

在这种情况下,正确的处理方法不是工会。它是使用一个左外部连接,而不是LINQ默认的内部连接。这将允许您一次性选择所有行,并在数据匹配适当的情况下设置flag

代码语言:javascript
复制
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")
              };
票数 3
EN

Stack Overflow用户

发布于 2014-02-13 20:49:50

您可以使用GroupBy按其ID对记录进行分组,并仅选择其中一个:

代码语言:javascript
复制
var results = ldrSet.Union(allEmpSet)
    .GroupBy(item => item.ID, (key, items) => 
        items.OrderBy(item => item.flag)
        .FirstOrDefault());

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21765138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档