【问题标题】:LINQ Right and Left JoinsLINQ 右连接和左连接
【发布时间】:2017-02-02 05:48:52
【问题描述】:

我正在 LINQ PadRight, Left and Inner Joins 练习 LINQ,我注意到了一些事情

(from a in Employees join b in Persons
     on a.PersonId equals b.PersonId into x
     from c in x.DefaultIfEmpty()
select  new {
        a.EmployeeId,
        c.PersonId,
        c.CompleteName
}).Take(50).OrderByDescending(m => m.EmployeeId)

(from a in Persons join b in  Employees
    on a.PersonId equals b.PersonId
select new {
    b.EmployeeId,
    b.PersonId,
    a.CompleteName
 }).Take(50).OrderByDescending(m => m.EmployeeId)

结果相同。

(from a in Persons join b in  Employees
    on a.PersonId equals b.PersonId into x
    from c in x.DefaultIfEmpty()
select 
     new {
        c.EmployeeId,
        c.PersonId,
        a.CompleteName
}).Take(50).OrderByDescending(m => m.EmployeeId)

我在 linq 中搜索 right and left joins,但我的问题是我的示例中的右连接或左连接在哪里?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    默认情况下,LinQ 中的所有连接都是INNER(不是右或左)。

    您的第一个和第三个查询是 LEFT OUTHER JOIN 因为 x.DefaultIfEmpty() 行。第二 - INNER JOIN

    第一个和第二个查询有相同的结果可能是因为.Take(50),在你的 50 行上,INNEROUTHER 之间可能没有区别。

    【讨论】:

    • 我有超过 200 条数据。我试着拿50个。 1st and 2nd 查询具有相同的输出。不知道为什么。
    • @KiRa 摆脱 Take,你会看到第一个 jquery LEFT OUTHER 和 2nd - INNER
    • @KiRa 检查this answer。简单的右外连接。东西在from cats in joined.DefaultIfEmpty() 线上
    • van..我真的不明白我的例子有什么区别:(。对新学习者来说很难。
    • @KiRa 仔细看看你加入了什么(查询中)。但实际上,当您使用 linq 时,您使用 OUTHER 连接真的很少见
    【解决方案2】:

    我在您的查询中没有发现任何问题,看起来不错。 要查看inner joinLeft joinright join 是否有任何变化,您必须有数据。

    如果有一些Persons 不是employees,将在您的第一个查询中看到,为此您必须检查整个数据,first 50 可能不会告诉您。反之亦然。

    【讨论】:

    • 我有超过 200 条数据。我试着拿50个。第一个和第二个查询具有相同的输出。不知道为什么
    • 是的,因为无论表的内部联接中有什么数据,left join 中都会有,而左联接将有额外的数据,因为您必须通过删除 .Take(50) 来检查。或者你可以检查计数,它会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多