연습: 관계 간 쿼리(C#)
이 연습에서는 LINQ to SQL 연결을 사용하여 데이터베이스의 외래 키 관계를 나타내는 방법을 보여 줍니다.
참고 항목
일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 IDE 개인 설정을 참조하세요.
이 연습은 Visual C# 개발 설정을 사용하여 작성했습니다.
필수 조건
연습: 단순 개체 모델 및 쿼리(C#)를 완료해야 합니다. 이 연습은 c:\linqtest5에 있는 northwnd.mdf 파일을 비롯하여 해당 개체 모델 및 쿼리를 기반으로 합니다.
개요
이 연습은 다음과 같은 세 가지 주요 작업으로 구성됩니다.
Northwind 샘플 데이터베이스의 Orders 테이블을 나타내는 엔터티 클래스 추가
Customer
및Customer
클래스 간의 관계를 향상시키기 위해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 개체에 액세스하려면
다음 코드를
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); }
F5 키를 눌러 애플리케이션을 디버깅합니다.
참고 항목
db.Log = Console.Out;
을 주석으로 처리하여 콘솔 창에서 SQL 코드를 제거할 수 있습니다.콘솔 창에서 Enter 키를 눌러 디버깅을 중지합니다.
강력한 형식의 데이터베이스 뷰 만들기
강력한 형식의 데이터베이스 뷰로 작업을 시작하는 것이 훨씬 더 쉽습니다. DataContext 개체를 강력한 형식으로 설정하면 GetTable 호출이 필요하지 않습니다. 강력한 형식의 DataContext 개체를 사용할 경우 모든 쿼리에서 강력한 형식의 테이블을 사용할 수 있습니다.
다음 단계에서는 Customers
를 데이터베이스의 Customers 테이블에 매핑되는 강력한 형식의 테이블로 만듭니다.
DataContext 개체를 강력한 형식으로 설정하려면
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) { } }
다음과 같이 강력한 형식의
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();
F5 키를 눌러 애플리케이션을 디버깅합니다.
콘솔 창 출력은 다음과 같습니다.
ID=WHITC
콘솔 창에서 Enter 키를 눌러 디버깅을 중지합니다.
다음 단계
다음 연습(연습: 데이터 조작(C#))에서는 데이터를 조작하는 방법을 보여 줍니다. 다음 연습에서는 이미 완료한 이 시리즈의 연습 두 개를 저장할 필요가 없습니다.