Share via


연습: 관계 간 쿼리(Visual Basic)

이 연습에서는 LINQ to SQL 연결을 사용하여 데이터베이스의 외래 키 관계를 나타내는 방법을 보여 줍니다.

참고 항목

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 IDE 개인 설정을 참조하세요.

이 연습은 Visual Basic 개발 설정을 사용하여 작성했습니다.

필수 조건

연습: 단순 개체 모델 및 쿼리(Visual Basic)를 완료해야 합니다. 이 연습은 c:\linqtest에 있는 northwnd.mdf 파일을 비롯하여 해당 연습의 단순 개체 모델 및 쿼리를 기반으로 합니다.

개요

이 연습은 다음과 같은 세 가지 주요 작업으로 구성됩니다.

  • Northwind 샘플 데이터베이스의 Orders 테이블을 나타내는 엔터티 클래스 추가

  • CustomerCustomer 클래스 간의 관계를 향상시키기 위해 Order 클래스에 주석 추가

  • Order 클래스를 사용하여 Customer 정보를 가져오는 과정을 테스트하는 쿼리 만들기 및 실행

테이블 간 관계 매핑

Customer 클래스 정의 후에 Order가 외래 키로 Orders.Customer에 관련된다는 것을 나타내는 다음 코드가 포함된 Customers.CustomerID 엔터티 클래스 정의를 만듭니다.

Order 엔터티 클래스를 추가하려면

  • Customer 클래스 뒤에 다음 코드를 입력하거나 붙여넣습니다.

    <Table(Name:="Orders")> _
    Public Class Order
        Private _OrderID As Integer
        Private _CustomerID As String
        Private _Customers As EntityRef(Of Customer)
    
        Public Sub New()
            Me._Customers = New EntityRef(Of Customer)()
        End Sub
    
        <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _
            IsPrimaryKey:=True, IsDBGenerated:=True)> _
        Public ReadOnly Property OrderID() As Integer
            Get
                Return Me._OrderID
            End Get
        End Property
        ' No need to specify a setter because IsDBGenerated is true.
    
        <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _
        Public Property CustomerID() As String
            Get
                Return Me._CustomerID
            End Get
            Set(ByVal value As String)
                Me._CustomerID = value
            End Set
        End Property
    
        <Association(Storage:="_Customers", ThisKey:="CustomerID")> _
        Public Property Customers() As Customer
            Get
                Return Me._Customers.Entity
            End Get
            Set(ByVal value As Customer)
                Me._Customers.Entity = value
            End Set
        End Property
    End Class
    

Customer 클래스에 주석 지정

이 단계에서는 Customer 클래스에 대한 관계를 나타내기 위해 Order 클래스에 주석을 지정합니다. (어느 방향으로든 관계를 정의하면 링크를 만들기에 충분하기 때문에 이 추가가 꼭 필요한 것은 아닙니다. 그러나 이 주석을 추가하면 어느 방향으로든 개체를 쉽게 탐색할 수 있습니다.)

Customer 클래스에 주석을 달려면

  • Customer 클래스에 다음 코드를 입력하거나 붙여넣습니다.

    Private _Orders As EntitySet(Of Order)
    
    Public Sub New()
        Me._Orders = New EntitySet(Of Order)()
    End Sub
    
    <Association(Storage:="_Orders", OtherKey:="CustomerID")> _
    Public Property Orders() As EntitySet(Of Order)
        Get
            Return Me._Orders
        End Get
        Set(ByVal value As EntitySet(Of Order))
            Me._Orders.Assign(value)
        End Set
    End Property
    

Customer 및 Order 관계에서 쿼리 만들기 및 실행

이제 Order 개체에서 Customer 개체를 직접 액세스하거나 그 반대 방향으로 액세스할 수 있습니다. 고객과 주문 간에 명시적인 조인이 필요하지 않습니다.

Customer 개체를 사용하여 Order 개체에 액세스하려면

  1. 다음 코드를 Sub Main 메서드에 입력하거나 붙여넣어 이 메서드를 수정합니다.

    ' Query for customers who have no orders.
    Dim custQuery = _
        From cust In Customers _
        Where Not cust.Orders.Any() _
        Select cust
    
    Dim msg As String = "", title As String = _
        "Customers With No Orders", response As MsgBoxResult, _
        style As MsgBoxStyle = MsgBoxStyle.Information
    
    For Each custObj In custQuery
        msg &= String.Format(custObj.CustomerID & vbCrLf)
    Next
    response = MsgBox(msg, style, title)
    
  2. F5 키를 눌러 애플리케이션을 디버깅합니다.

    두 이름이 메시지 상자에 표시되며 콘솔 창에는 생성된 SQL 코드가 표시됩니다.

  3. 메시지 상자를 닫아 디버깅을 중지합니다.

강력한 형식의 데이터베이스 뷰 만들기

강력한 형식의 데이터베이스 뷰로 작업을 시작하는 것이 훨씬 더 쉽습니다. DataContext 개체를 강력한 형식으로 설정하면 GetTable 호출이 필요하지 않습니다. 강력한 형식의 DataContext 개체를 사용할 경우 모든 쿼리에서 강력한 형식의 테이블을 사용할 수 있습니다.

다음 단계에서는 Customers를 데이터베이스의 Customers 테이블에 매핑되는 강력한 형식의 테이블로 만듭니다.

DataContext 개체를 강력한 형식으로 설정하려면

  1. Customer 클래스 선언 위에 다음 코드를 추가합니다.

    Public Class Northwind
        Inherits DataContext
        ' Table(Of T) abstracts database details  per
        ' table/data type.
        Public Customers As Table(Of Customer)
        Public Orders As Table(Of Order)
    
        Public Sub New(ByVal connection As String)
            MyBase.New(connection)
        End Sub
    End Class
    
  2. 다음과 같이 강력한 형식의 Sub Main를 사용하도록 DataContext을 수정합니다.

    ' Use a connection string.
    Dim db As New Northwind _
        ("C:\linqtest\northwnd.mdf")
    
    ' Query for customers from Seattle.
    Dim custs = _
        From cust In db.Customers _
        Where cust.City = "Seattle" _
        Select cust
    
    For Each custObj In custs
        Console.WriteLine("ID=" & custObj.CustomerID)
    Next
    
    ' Freeze the console window.
    Console.ReadLine()
    
  3. F5 키를 눌러 애플리케이션을 디버깅합니다.

    콘솔 창 출력은 다음과 같습니다.

    ID=WHITC

  4. 콘솔 창에서 Enter 키를 눌러 애플리케이션을 닫습니다.

  5. 이 애플리케이션을 저장하려면 파일 메뉴에서 모두 저장을 클릭합니다.

다음 단계

다음 연습(연습: 데이터 조작(Visual Basic))에서는 데이터를 조작하는 방법을 보여 줍니다. 다음 연습에서는 이미 완료한 이 시리즈의 연습 두 개를 저장할 필요가 없습니다.

참고 항목