隐藏

如何使用 Join 和 GroupJoin 方法通过基于方法的查询语法来查询-联接运算符

发布:2021/7/9 16:36:45作者:管理员 来源:本站 浏览次数:762

本主题中的示例演示如何使用 Join 和 GroupJoin 方法通过基于方法的查询语法来查询 AdventureWorks 销售模型 。 这些示例中使用的 AdventureWorks 销售模型从 AdventureWorks 示例数据库中的 Contact、Address、Product、SalesOrderHeader 和 SalesOrderDetail 等表生成。


本主题中的示例使用以下 using / Imports 语句:

C#


using System;

using System.Data;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.Objects;

using System.Globalization;

using System.Data.EntityClient;

using System.Data.SqlClient;

using System.Data.Common;


GroupJoin

示例


以下示例针对 SalesOrderHeader 表和 SalesOrderDetail 表执行 GroupJoin 以查找每个客户的订单数。 组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。

C#


using (AdventureWorksEntities context = new AdventureWorksEntities())

{

   ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;

   ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails;


   var query = orders.GroupJoin(details,

       order => order.SalesOrderID,

       detail => detail.SalesOrderID,

       (order, orderGroup) => new

       {

           CustomerID = order.SalesOrderID,

           OrderCount = orderGroup.Count()

       });


   foreach (var order in query)

   {

       Console.WriteLine("CustomerID: {0}  Orders Count: {1}",

           order.CustomerID,

           order.OrderCount);

   }

}


示例


下面的示例对 Contact 和 SalesOrderHeader 表执行 GroupJoin 以查找每个联系人的订单数。 将显示每个联系人的订单数和 ID。

C#


using (AdventureWorksEntities context = new AdventureWorksEntities())

{

   ObjectSet<Contact> contacts = context.Contacts;

   ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;


   var query = contacts.GroupJoin(orders,

       contact => contact.ContactID,

       order => order.Contact.ContactID,

       (contact, contactGroup) => new

       {

           ContactID = contact.ContactID,

           OrderCount = contactGroup.Count(),

           Orders = contactGroup

       });


   foreach (var group in query)

   {

       Console.WriteLine("ContactID: {0}", group.ContactID);

       Console.WriteLine("Order count: {0}", group.OrderCount);

       foreach (var orderInfo in group.Orders)

       {

           Console.WriteLine("   Sale ID: {0}", orderInfo.SalesOrderID);

       }

       Console.WriteLine("");

   }

   }


联接

示例


以下示例针对 Contact 表和 SalesOrderHeader 表执行联接。

C#


using (AdventureWorksEntities context = new AdventureWorksEntities())

{

   ObjectSet<Contact> contacts = context.Contacts;

   ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;


   var query =

       contacts.Join(

           orders,

           order => order.ContactID,

           contact => contact.Contact.ContactID,

           (contact, order) => new

           {

               ContactID = contact.ContactID,

               SalesOrderID = order.SalesOrderID,

               FirstName = contact.FirstName,

               Lastname = contact.LastName,

               TotalDue = order.TotalDue

           });


   foreach (var contact_order in query)

   {

       Console.WriteLine("ContactID: {0} "

                       + "SalesOrderID: {1} "

                       + "FirstName: {2} "

                       + "Lastname: {3} "

                       + "TotalDue: {4}",

           contact_order.ContactID,

           contact_order.SalesOrderID,

           contact_order.FirstName,

           contact_order.Lastname,

           contact_order.TotalDue);

   }

}


示例


以下示例针对 Contact 表和 SalesOrderHeader 表执行联接,同时按联系人 ID 对结果分组。

C#


using (AdventureWorksEntities context = new AdventureWorksEntities())

{

   ObjectSet<Contact> contacts = context.Contacts;

   ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;


   var query = contacts.Join(

       orders,

       order => order.ContactID,

       contact => contact.Contact.ContactID,

       (contact, order) => new

       {

           ContactID = contact.ContactID,

           SalesOrderID = order.SalesOrderID,

           FirstName = contact.FirstName,

           Lastname = contact.LastName,

           TotalDue = order.TotalDue

       })

           .GroupBy(record => record.ContactID);


   foreach (var group in query)

   {

       foreach (var contact_order in group)

       {

           Console.WriteLine("ContactID: {0} "

                           + "SalesOrderID: {1} "

                           + "FirstName: {2} "

                           + "Lastname: {3} "

                           + "TotalDue: {4}",

               contact_order.ContactID,

               contact_order.SalesOrderID,

               contact_order.FirstName,

               contact_order.Lastname,

               contact_order.TotalDue);

       }

   }

}


请参阅


   LINQ to Entities 中的查询