연습: 관계 간 쿼리(C#)

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

참고 항목

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

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

필수 조건

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

개요

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

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

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

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

테이블 간 관계 매핑

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

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

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

    [Table(Name = "Orders")]
    public class Order
    {
        private int _OrderID = 0;
        private string _CustomerID;
        private EntityRef<Customer> _Customer;
        public Order() { this._Customer = new EntityRef<Customer>(); }
    
        [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
        IsPrimaryKey = true, IsDbGenerated = true)]
        public int OrderID
        {
            get { return this._OrderID; }
            // No need to specify a setter because IsDBGenerated is
            // true.
        }
    
        [Column(Storage = "_CustomerID", DbType = "NChar(5)")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }
    
        [Association(Storage = "_Customer", ThisKey = "CustomerID")]
        public Customer Customer
        {
            get { return this._Customer.Entity; }
            set { this._Customer.Entity = value; }
        }
    }
    

Customer 클래스에 주석 지정

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

Customer 클래스에 주석을 달려면

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

    private EntitySet<Order> _Orders;
    public Customer()
    {
        this._Orders = new EntitySet<Order>();
    }
    
    [Association(Storage = "_Orders", OtherKey = "CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    }
    

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

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

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

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

    // Query for customers who have placed orders.
    var custQuery =
        from cust in Customers
        where cust.Orders.Any()
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID,
            custObj.Orders.Count);
    }
    
  2. F5 키를 눌러 애플리케이션을 디버깅합니다.

    참고 항목

    db.Log = Console.Out;을 주석으로 처리하여 콘솔 창에서 SQL 코드를 제거할 수 있습니다.

  3. 콘솔 창에서 Enter 키를 눌러 디버깅을 중지합니다.

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

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

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

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

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

    public class Northwind : DataContext
    {
        // Table<T> abstracts database details per table/data type.
        public Table<Customer> Customers;
        public Table<Order> Orders;
    
        public Northwind(string connection) : base(connection) { }
    }
    
  2. 다음과 같이 강력한 형식의 Main를 사용하도록 DataContext 메서드를 수정합니다.

    // Use a connection string.
    Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf");
    
    // Query for customers from Seattle.
    var custQuery =
        from cust in db.Customers
        where cust.City == "Seattle"
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine("ID={0}", custObj.CustomerID);
    }
    // Freeze the console window.
    Console.ReadLine();
    
  3. F5 키를 눌러 애플리케이션을 디버깅합니다.

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

    ID=WHITC

  4. 콘솔 창에서 Enter 키를 눌러 디버깅을 중지합니다.

다음 단계

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

참고 항목