쿼리를 원격으로 실행하거나(즉, 데이터베이스 엔진이 데이터베이스에 대해 쿼리를 실행) 로컬로 실행하도록 결정할 수 있습니다(LINQ to SQL은 로컬 캐시에 대해 쿼리를 실행).
원격 실행
다음과 같은 쿼리를 고려해 보세요.
Northwnd db = new Northwnd(@"northwnd.mdf");
Customer c = db.Customers.Single(x => x.CustomerID == "19283");
foreach (Order ord in
c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
// Do something.
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim c As Customer = _
(From cust In db.Customers _
Where cust.CustomerID = 19283).First()
Dim orders = From ord In c.Orders _
Where ord.ShippedDate.Value.Year = 1998
For Each nextOrder In orders
' Do something.
Next
데이터베이스에 수천 개의 주문 행이 있는 경우 작은 하위 집합을 처리하기 위해 모두 검색하지 않으려는 것입니다. LINQ to SQL에서 클래스는 EntitySet<TEntity> 인터페이스를 IQueryable 구현합니다. 이 방법을 사용하면 이러한 쿼리를 원격으로 실행할 수 있습니다. 이 기법의 두 가지 주요 이점은 다음과 같습니다.
불필요한 데이터가 검색되지 않습니다.
데이터베이스 인덱스 때문에 데이터베이스 엔진에서 실행하는 쿼리가 더 효율적인 경우가 많습니다.
로컬 실행
다른 상황에서는 로컬 캐시에 관련 엔터티의 전체 집합을 저장하고 싶을 수도 있습니다. 이를 위해 EntitySet<TEntity>의 모든 멤버를 명시적으로 로드하는 Load 메서드를 EntitySet<TEntity>가 제공합니다.
EntitySet<TEntity> 이미 로드된 경우 후속 쿼리가 로컬로 실행됩니다. 이 방법은 다음 두 가지 방법으로 도움이 됩니다.
전체 집합을 로컬로 또는 여러 번 사용해야 하는 경우 원격 쿼리 및 관련 대기 시간을 방지할 수 있습니다.
엔터티는 완전한 상태로 직렬화할 수 있습니다.
다음 코드 조각에서는 로컬 실행을 가져오는 방법을 보여 줍니다.
Northwnd db = new Northwnd(@"northwnd.mdf");
Customer c = db.Customers.Single(x => x.CustomerID == "19283");
c.Orders.Load();
foreach (Order ord in
c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
// Do something.
}
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim c As Customer = _
(From cust In db.Customers _
Where cust.CustomerID = 19283).First
c.Orders.Load()
Dim orders = From ord In c.Orders _
Where ord.ShippedDate.Value.Year = 1998
For Each nextOrder In orders
' Do something.
Next
비교
이러한 두 가지 기능은 큰 컬렉션에 대한 원격 실행과 작은 컬렉션에 대한 로컬 실행 또는 전체 컬렉션이 필요한 경우 옵션의 강력한 조합을 제공합니다. IQueryable을 사용하여 원격 실행을 구현하고, 메모리 내 IEnumerable<T> 컬렉션에 대해 로컬 실행을 합니다. 로컬 실행을 강제로 적용하려면 형식IEnumerable<T>을 제네릭 IEnumerable로 변환을 참조하세요.
정렬되지 않은 집합에 대한 쿼리
구현 List<T> 하는 로컬 컬렉션과 관계형 데이터베이스의 정렬되지 않은 집합 에 대해 실행되는 원격 쿼리를 제공하는 컬렉션 간의 중요한 차이점을 확인합니다. List<T> 인덱스 값을 사용하는 메서드와 같은 메서드에는 일반적으로 정렬되지 않은 집합에 대한 원격 쿼리를 통해 가져올 수 없는 목록 의미 체계가 필요합니다. 이러한 이유로, 로컬 실행을 허용하기 위해 EntitySet<TEntity>를 암시적으로 로드합니다.