관계 간 쿼리(LINQ to SQL)
업데이트: November 2007
클래스 정의에서 다른 개체 또는 다른 개체의 컬렉션에 대한 참조는 데이터베이스의 외래 키 관계에 직접적으로 해당합니다. 점 표기법을 사용하여 쿼리할 때 이러한 관계를 사용하여 관계 속성에 액세스하고 한 개체에서 다른 개체로 이동할 수 있습니다. 이러한 액세스 작업은 해당 SQL에서 더 복잡한 조인이나 연관된 하위 쿼리로 변환됩니다.
예를 들어 다음 쿼리는 런던에 있는 고객의 주문으로만 결과를 제한하기 위한 방법으로 주문에서 고객으로 이동합니다.
Dim db As New Northwnd("c:\northwnd.mdf")
Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord
Northwnd db = new Northwnd(@"northwnd.mdf");
IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
관계 속성이 없을 경우에는 다음 코드와 같이 SQL 쿼리에서처럼 관계 속성을 조인으로 직접 작성해야 합니다.
Dim db As New Northwnd("c:\northwnd.mdf")
Dim londOrderQuery = _
From cust In db.Customers _
Join ord In db.Orders On cust.CustomerID Equals ord.CustomerID _
Select ord
Northwnd db = new Northwnd(@"northwnd.mdf");
IQueryable<Order> londonOrderQuery =
from cust in db.Customers
join ord in db.Orders on cust.CustomerID equals ord.CustomerID
where cust.City == "London"
select ord;
관계 속성을 사용하여 이 특정 관계를 한 번 정의한 다음 더 편리한 점 구문을 사용할 수 있습니다. 그러나 관계 속성이 존재하는 더 중요한 이유는 도메인 관련 개체 모델이 일반적으로 계층 구조나 그래프로 정의되기 때문입니다. 사용자가 프로그래밍하는 개체는 다른 개체에 대한 참조를 가집니다. 운이 좋다면 개체 간의 관계와 데이터베이스의 외래 키 스타일 관계가 일치할 수도 있습니다. 그런 다음 속성 액세스를 통해 조인을 편리하게 작성할 수 있습니다.
이와 관련하여 관계 속성은 쿼리 자체의 일부보다는 쿼리의 결과 측면에서 더 중요합니다. 쿼리에서 특정 고객에 대한 데이터를 검색한 후 클래스 정의에서는 고객이 주문을 갖고 있다는 것을 나타냅니다. 즉, 특정 고객의 Orders 속성은 해당 고객의 모든 주문으로 채워지는 컬렉션으로 간주됩니다. 실제로 이 방식으로 클래스를 정의하여 계약이 선언됩니다 쿼리가 주문을 요청하지 않은 경우에도 주문을 보게 될 것입니다. 또한 개체 모델은 즉시 사용 가능한 관련 개체가 있는 데이터베이스의 메모리 내 확장이라는 가정을 유지합니다.
이제 관계가 존재하므로 클래스에 정의된 관계 속성을 참조하여 쿼리를 작성할 수 있습니다. 이러한 관계 참조는 데이터베이스의 외래 키 관계에 해당합니다. 이러한 관계를 사용하는 작업은 해당 SQL에서 더 복잡한 조인으로 변환됩니다. AssociationAttribute 특성을 사용하여 관계를 정의한 경우 LINQ to SQL에서 명시적 조인을 코딩할 필요가 없습니다.
이 가정을 유지하는 데 도움이 되도록 LINQ to SQL은 지연된 로드라는 기술을 구현합니다. 자세한 내용은 지연된 로드와 즉시 로드 비교(LINQ to SQL)를 참조하십시오.
CustomerID-OrderID 쌍의 목록을 반환하기 위한 다음 SQL 쿼리를 살펴보십시오.
SELECT t0.CustomerID, t1.OrderID
FROM Customers AS t0 INNER JOIN
Orders AS t1 ON t0.CustomerID = t1.CustomerID
WHERE (t0.City = @p0)
다음 그림에서는 테이블 관계를 그래픽으로 보여 줍니다.
LINQ to SQL을 사용하여 동일한 결과를 얻으려면 이미 Customer 클래스에 있는 Orders 속성 참조를 사용합니다. Orders 참조는 다음 코드와 같이 쿼리를 실행하고 CustomerID-OrderID 쌍을 반환하는 데 필요한 정보를 제공합니다.
Dim db As New Northwnd("c:\northwnd.mdf")
Dim idQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select cust.CustomerID, ord.OrderID
Northwnd db = new Northwnd(@"northwnd.mdf");
var idQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select new { cust.CustomerID, ord.OrderID };
반대로 할 수도 있습니다. 즉, Orders를 쿼리하고 해당 Customer 관계 참조를 사용하여 연관된 Customer 개체에 대한 정보에 액세스할 수 있습니다. 다음 코드는 앞의 경우와 동일한 CustomerID-OrderID 쌍을 반환하지만 Customers 대신 Orders를 쿼리합니다.
Dim db As New Northwnd("c:\northwnd.mdf")
Dim idQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord.CustomerID, ord.OrderID
Northwnd db = new Northwnd(@"northwnd.mdf");
var idQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select new { ord.Customer.CustomerID, ord.OrderID };