【问题标题】:LINQ Left Outer JOIN Syntax DifferenceLINQ Left Outer JOIN 语法差异
【发布时间】:2011-07-22 13:40:46
【问题描述】:

在 LINQ 中至少有两种方式进行 LEFT OUTER JOIN

class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Order
{
    public int ID { get; set; }
    public string Product { get; set; }
}

    static void Main()
    {
        // Example customers.
        var customers = new Customer[]
        {
            new Customer{ID = 5, Name = "Sam"},
            new Customer{ID = 6, Name = "Dave"},
            new Customer{ID = 7, Name = "Julia"},
            new Customer{ID = 8, Name = "Sue"},
            new Customer{ID = 9, Name = "Joe"}
        };

        // Example orders.
        var orders = new Order[]
        {
            new Order{ID = 5, Product = "Book"},
            new Order{ID = 6, Product = "Game"},
            new Order{ID = 7, Product = "Computer"},
            new Order{ID = 8, Product = "Shirt"},
            new Order{ID = 8, Product = "TShirt"}
        };


        // First Way
        var query = from c in customers
                join o in orders on c.ID equals o.ID into co
                from x in co.DefaultIfEmpty() 
                where x != null && x.Product == "Shirt"
                select new {c, x};

        // Second Way  
        var query2 = from c in customers
                     from o in orders
                     where c.ID == o.ID && o.Product == "Shirt"
                     select new {c, o};
    }

我发现了很多 First Way 的示例(使用 'into'),这就是我过去使用 LEFT OUTER JOINS 的方式。最近我找到了第二种方式,看起来更简单。我进行了测试,它们都产生了相同的结果。现在我的问题是有什么隐藏的差异、性能,还是只是语法糖?

非常感谢。

【问题讨论】:

  • 你到底为什么要使用左外连接,因为 !=null 检查,这肯定应该只是直接内连接?

标签: c# linq join linq-to-objects left-join


【解决方案1】:

如果不使用 !=null 检查,则应使用第一种方式

左外连接选择左表中的所有内容以及右表中匹配的所有项目,如果右表中不存在匹配项,则仍然返回结果,但右表中的值为空(linq 将其翻译为作为集合项类型的默认值)

您的两个查询都有效地执行了内部联接,因此它们将是相同的。

得到不同的结果

 // First Way
 var query = from c in customers
 join o in orders on c.ID equals o.ID into co
 from x in co.DefaultIfEmpty()
 where c.Id>5 
 select new {c, x};

 // Second Way
 var query2 = from c in customers
 from o in orders
 where c.ID == o.ID && c.ID > 5
 select new {c, o};

【讨论】:

  • 感谢鲍勃。你是对的,如果我使用 != null 检查,在这种情况下它们都是内部连接。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 2014-07-14
  • 1970-01-01
  • 2014-08-10
  • 2021-12-20
  • 2013-03-10
  • 2017-06-18
  • 2021-06-11
相关资源
最近更新 更多