📜  LINQ联接运算符(1)

📅  最后修改于: 2023-12-03 14:43:54.772000             🧑  作者: Mango

LINQ联接运算符

在LINQ中,联接运算符可以用来将多个集合中的元素连接在一起并形成一个组合集合。这些联接运算符可以用于两个集合或多个集合。以下是常用的联接运算符:

  • Inner Join
  • Left Outer Join
  • Right Outer Join
  • Full Outer Join
Inner Join

Inner Join返回两个集合中具有相同键的元素。以下是Inner Join的语法:

var innerJoinQuery = from c in customers
                    join o in orders
                    on c.CustomerID equals o.CustomerID
                    select new
                    {
                        CustomerName = c.CustomerName,
                        OrderID = o.OrderID
                    };

其中,customersorders是两个不同的集合,CustomerID是它们中相同的键。这个查询语句返回的是一个新的集合,其中包含所有具有相同CustomerIDcustomers中的元素和orders中的元素。

Left Outer Join

Left Outer Join返回左集合中的所有元素以及右集合中具有相同键的元素,如果右集合中没有相同键的元素,则返回null。以下是Left Outer Join的语法:

var leftOuterJoinQuery = from c in customers
                        join o in orders
                        on c.CustomerID equals o.CustomerID into ordersGroup
                        from og in ordersGroup.DefaultIfEmpty()
                        select new
                        {
                            CustomerName = c.CustomerName,
                            OrderID = og == null ? -1 : og.OrderID
                        };

这里,我们使用了into关键字和DefaultIfEmpty扩展方法,它将Inner Join的结果转换为Left Outer Join。into所关联的右集合被分组,然后再使用from...DefaultIfEmpty()将该组转换成一个包含null值元素的新集合。最后,查询语句返回的是一个新的集合,其中包含所有customers中的元素和具有相同CustomerIDorders中的元素,但如果orders中没有具有相同CustomerID的元素,则返回null。

Right Outer Join

Right Outer Join返回右集合中的所有元素以及左集合中具有相同键的元素,如果左集合中没有相同键的元素,则返回null。以下是Right Outer Join的语法:

var rightOuterJoinQuery = from o in orders
                        join c in customers
                        on o.CustomerID equals c.CustomerID into customersGroup
                        from cg in customersGroup.DefaultIfEmpty()
                        select new
                        {
                            CustomerName = cg == null ? "No Customer" : cg.CustomerName,
                            OrderID = o.OrderID
                        };

这里,我们交换了Left Outer Join中的两个集合的顺序。使用into关键字和DefaultIfEmpty扩展方法,它将Inner Join的结果转换为Right Outer Join。into所关联的左集合被分组,然后再使用from...DefaultIfEmpty()将该组转换成一个包含null值元素的新集合。最后,查询语句返回的是一个新的集合,其中包含所有orders中的元素和具有相同CustomerIDcustomers中的元素,但如果customers中没有具有相同CustomerID的元素,则返回null。

Full Outer Join

Full Outer Join返回左右两个集合中的所有元素,如果左/右集合中没有与之匹配的元素,则返回null。以下是Full Outer Join的语法:

var fullOuterJoinQuery = (from c in customers
                         join o in orders
                         on c.CustomerID equals o.CustomerID into ordersGroup
                         from og in ordersGroup.DefaultIfEmpty()
                         select new
                         {
                             CustomerName = c.CustomerName,
                             OrderID = og == null ? -1 : og.OrderID
                         })
                         .Union
                         (from o in orders
                         join c in customers
                         on o.CustomerID equals c.CustomerID into customersGroup
                         from cg in customersGroup.DefaultIfEmpty()
                         select new
                         {
                             CustomerName = cg == null ? "No Customer" : cg.CustomerName,
                             OrderID = o.OrderID
                         });

这里,我们将Left Outer Join和Right Outer Join的结果组合成一个Full Outer Join。为此,我们使用了Union方法,它将两个集合的元素合并到一个新集合中,包括重复的元素。这个查询语句返回的是一个新的集合,其中包含所有customersorders中的元素,如果一个元素在左集合或右集合中没有相同键的元素,则返回null。

除了上述联接运算符,还有一些其他运算符可以用于联接多个集合,如交集、差集等。LINQ的联接运算符使得在多个集合中对元素进行操作变得轻松简单,是每个程序员必须掌握的重要工具。