可以决定远程执行查询(即数据库引擎针对数据库执行查询)或本地(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> 的所有成员。
如果< c0 />已加载,则后续查询会在本地执行。 此方法可通过两种方式提供帮助:
如果必须在本地或多次使用完整集,则可以避免远程查询和关联的延迟。
可以将实体序列化为完整的实体。
以下代码片段说明了如何获取本地执行:
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> 以允许本地执行。