クエリは、リモートで実行するか (つまり、データベース エンジンがデータベースに対してクエリを実行する)、ローカルで実行するか (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 インターフェイスを実装します。 この方法により、このようなクエリをリモートで実行できます。 この手法には、次の 2 つの主な利点があります。
不要なデータは取得されません。
データベース エンジンによって実行されるクエリは、多くの場合、データベース インデックスのためにより効率的です。
ローカル実行
その他の状況では、関連エンティティの完全なセットをローカル キャッシュに含める必要がある場合があります。 このため、EntitySet<TEntity>は、Loadのすべてのメンバーを明示的に読み込むためのEntitySet<TEntity> メソッドを提供します。
EntitySet<TEntity>が既に読み込まれている場合は、後続のクエリがローカルで実行されます。 この方法は、次の 2 つの方法で役立ちます。
完全なセットをローカルまたは複数回使用する必要がある場合は、リモート クエリと関連する待機時間を回避できます。
エンティティは完全なエンティティとしてシリアル化できます。
次のコード フラグメントは、ローカル実行を取得する方法を示しています。
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
比較
これら 2 つの機能は、大規模なコレクションのリモート実行と小さなコレクションのローカル実行、または完全なコレクションが必要な場合のオプションの強力な組み合わせを提供します。 IQueryableを使用してリモート実行を実装し、メモリ内のIEnumerable<T> コレクションに対してローカル実行を実装します。 ローカル実行 (つまり、 IEnumerable<T>) を強制するには、「 型をジェネリック IEnumerable に変換する」を参照してください。
順序なしセットに対するクエリ
List<T>を実装するローカル コレクションと、リレーショナル データベース内の順序指定されていないセットに対して実行されるリモート クエリを提供するコレクションの重要な違いに注意してください。 List<T> インデックス値を使用するメソッドなどのメソッドでは、リスト セマンティクスが必要です。通常、順序なしセットに対するリモート クエリでは取得できません。 このため、このようなメソッドは、ローカル実行を許可するために EntitySet<TEntity> を暗黙的に読み込みます。