다음을 통해 공유


쿼리 식 구문 예제: 조인 연산자

조인은 관계형 데이터베이스 테이블과 같이 서로 탐색 가능한 관계가 없는 데이터 원본을 대상으로 하는 쿼리에서 중요한 작업입니다. 두 데이터 원본의 조인은 한 데이터 원본의 개체와 다른 데이터 원본의 공통 특성을 공유하는 개체의 연결입니다. 자세한 내용은 표준 쿼리 연산자 개요를 참조하세요.

이 항목의 예제에서는 GroupJoinJoin 메서드를 사용하여 쿼리 식 구문을 사용하여 AdventureWorks Sales Model 쿼리하는 방법을 보여 줍니다. 이러한 예제에 사용된 AdventureWorks 판매 모델은 AdventureWorks 샘플 데이터베이스의 Contact, Address, Product, SalesOrderHeader 및 SalesOrderDetail 테이블에서 빌드됩니다.

이 항목의 예제에서는 다음과 같은 using/Imports 문을 사용합니다.

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;

Option Explicit On
Option Strict On
Imports System.Data.Objects
Imports System.Globalization

그룹조인

예시

다음 예제에서는 SalesOrderHeader 및 SalesOrderDetail 테이블에서 GroupJoin을 수행하여 고객당 주문 수를 찾습니다. 그룹 조인은 다른 데이터 원본에 상관 관계가 있는 요소가 없더라도 첫 번째(왼쪽) 데이터 원본의 각 요소를 반환하는 왼쪽 외부 조인과 동일합니다.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
    ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails;

    var query =
        from order in orders
        join detail in details
        on order.SalesOrderID
        equals detail.SalesOrderID into orderGroup
        select new
        {
            CustomerID = order.SalesOrderID,
            OrderCount = orderGroup.Count()
        };

    foreach (var order in query)
    {
        Console.WriteLine($"CustomerID: {order.CustomerID}  Orders Count: {order.OrderCount}");
    }
}
Using context As New AdventureWorksEntities
    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
    Dim details As ObjectSet(Of SalesOrderDetail) = context.SalesOrderDetails

    Dim query = _
        From order In orders _
        Group Join detail In details _
        On order.SalesOrderID _
        Equals detail.SalesOrderID Into orderGroup = Group _
        Select New With _
        { _
            .CustomerID = order.SalesOrderID, _
            .OrderCount = orderGroup.Count() _
        }

    For Each order In query
        Console.WriteLine("CustomerID: {0}  Orders Count: {1}", _
            order.CustomerID, order.OrderCount)
    Next
End Using

예시

다음 예제에서는 Contact 및 SalesOrderHeader 테이블에 대해 GroupJoin를 수행하여, 연락처당 주문 수를 찾습니다. 각 연락처의 주문 수 및 ID가 표시됩니다.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<Contact> contacts = context.Contacts;
    ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;

    var query =
        from contact in contacts
        join order in orders
        on contact.ContactID
        equals order.Contact.ContactID into contactGroup
        select new
        {
            ContactID = contact.ContactID,
            OrderCount = contactGroup.Count(),
            Orders = contactGroup
        };

    foreach (var group in query)
    {
        Console.WriteLine($"ContactID: {group.ContactID}");
        Console.WriteLine($"Order count: {group.OrderCount}");
        foreach (var orderInfo in group.Orders)
        {
            Console.WriteLine($"   Sale ID: {orderInfo.SalesOrderID}");
        }
        Console.WriteLine("");
    }
}
Using context As New AdventureWorksEntities
    Dim contacts As ObjectSet(Of Contact) = context.Contacts
    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders

    Dim query = _
        From contact In contacts _
        Group Join order In orders _
        On contact.ContactID _
        Equals order.Contact.ContactID Into contactGroup = Group _
        Select New With { _
            .ContactID = contact.ContactID, _
            .OrderCount = contactGroup.Count(), _
            .Orders = contactGroup.Select(Function(order) order)}

    For Each group In query
        Console.WriteLine("ContactID: {0}", group.ContactID)
        Console.WriteLine("Order count: {0}", group.OrderCount)

        For Each orderInfo In group.Orders
            Console.WriteLine("   Sale ID: {0}", orderInfo.SalesOrderID)
        Next

        Console.WriteLine("")
    Next
End Using

가입하다

예시

다음 예제에서는 SalesOrderHeader 및 SalesOrderDetail 테이블을 통해 조인을 수행하여 8월의 온라인 주문을 가져옵니다.

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
    ObjectSet<SalesOrderDetail> details = context.SalesOrderDetails;

    var query =
        from order in orders
        join detail in details
        on order.SalesOrderID equals detail.SalesOrderID
        where order.OnlineOrderFlag == true
        && order.OrderDate.Month == 8
        select new
        {
            SalesOrderID = order.SalesOrderID,
            SalesOrderDetailID = detail.SalesOrderDetailID,
            OrderDate = order.OrderDate,
            ProductID = detail.ProductID
        };

    foreach (var order in query)
    {
        Console.WriteLine($"{order.SalesOrderID}\t{order.SalesOrderDetailID}\t{order.OrderDate:d}\t{order.ProductID}");
    }
}
Using context As New AdventureWorksEntities
    Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
    Dim details As ObjectSet(Of SalesOrderDetail) = context.SalesOrderDetails

    Dim query = _
        From ord In orders _
        Join det In details _
        On ord.SalesOrderID Equals det.SalesOrderID _
        Where ord.OnlineOrderFlag = True _
                And ord.OrderDate.Month = 8 _
        Select New With _
        { _
            .SalesOrderID = ord.SalesOrderID, _
            .SalesOrderDetailID = det.SalesOrderDetailID, _
            .OrderDate = ord.OrderDate, _
            .ProductID = det.ProductID _
        }

    For Each ord In query
        Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2:d}" & vbTab & "{3}", _
            ord.SalesOrderID, _
            ord.SalesOrderDetailID, _
            ord.OrderDate, _
            ord.ProductID)
    Next
End Using

참고하십시오