클래스 정의에 있는 다른 개체 또는 다른 개체의 컬렉션에 대한 참조는 데이터베이스의 외래 키 관계에 직접 해당합니다. 점 표기법을 사용하여 관계 속성에 액세스하고 개체 간에 탐색하여 쿼리할 때 이러한 관계를 사용할 수 있습니다. 이러한 액세스 작업은 해당 SQL에서 더 복잡한 조인 또는 상관 관계가 있는 하위 쿼리로 변환됩니다.
예를 들어 다음 쿼리는 결과를 런던에 있는 고객의 주문으로만 제한하는 방법으로 주문에서 고객으로 이동합니다.
Northwnd db = new Northwnd(@"northwnd.mdf");
IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
Dim db As New Northwnd("c:\northwnd.mdf")
Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord
관계 속성이 존재하지 않는 경우, SQL 쿼리에서처럼 다음 코드와 같이 수동으로 조인을 작성해야 합니다.
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;
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
관계 속성을 사용하여 이 특정 관계를 한 번 정의할 수 있습니다. 그런 다음 보다 편리한 점 구문을 사용할 수 있습니다. 그러나 도메인별 개체 모델은 일반적으로 계층 또는 그래프로 정의되기 때문에 관계 속성이 더 중요합니다. 프로그래밍하는 개체에는 다른 개체에 대한 참조가 있습니다. 개체 대 개체 관계가 데이터베이스의 외래 키 스타일 관계에 해당한다는 것은 행복한 우연의 일치일 뿐입니다. 그런 다음 속성 액세스는 조인을 작성하는 편리한 방법을 제공합니다.
이와 관련하여 관계 속성은 쿼리 자체의 일부보다 쿼리의 결과 쪽에서 더 중요합니다. 쿼리가 특정 고객에 대한 데이터를 검색한 후 클래스 정의는 고객에게 주문이 있음을 나타냅니다. 즉, 특정 고객의 Orders
속성은 해당 고객의 모든 주문으로 채워진 컬렉션이 될 것으로 기대됩니다. 실제로 이러한 방식으로 클래스를 정의하여 선언한 계약입니다. 쿼리에서 주문을 요청하지 않은 경우에도 주문이 표시됩니다. 개체 모델이 관련 개체를 즉시 사용할 수 있는 데이터베이스의 메모리 내 확장이라는 환상을 유지할 것으로 예상합니다.
이제 관계가 있으므로 클래스에 정의된 관계 속성을 참조하여 쿼리를 작성할 수 있습니다. 이러한 관계 참조는 데이터베이스의 외래 키 관계에 해당합니다. 이러한 관계를 사용하는 작업은 해당 SQL에서 더 복잡한 조인으로 변환됩니다. 관계를 정의한 경우(특성을 사용하여 AssociationAttribute ) LINQ to SQL에서 명시적 조인을 코딩할 필요가 없습니다.
이러한 환상을 유지하기 위해 LINQ to SQL은 지연 로드라는 기술을 구현합니다. 자세한 내용은 지연 로딩 대 즉시 로딩을 참조하세요.
다음 SQL 쿼리를 사용하여 쌍 목록을 CustomerID
-OrderID
프로젝스합니다.
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을 사용하여 동일한 결과를 얻으려면 Orders
클래스에 이미 존재하는 속성 참조를 사용합니다. 참조는 Orders
다음 코드와 같이 쿼리를 실행하고 쌍을 CustomerID
-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 };
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
반대로 할 수도 있습니다. 즉, Orders
를 쿼리하고 Customer
관계 참조를 사용하여 연결된 Customer
개체에 대한 정보에 액세스할 수 있습니다. 이전과 동일한 CustomerID
-OrderID
쌍을 투영하는 다음 코드는 이번에는 Orders
대신 Customers
에 쿼리를 통해 수행됩니다.
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 };
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