远程执行与本地执行

可以决定远程执行查询(即数据库引擎针对数据库执行查询)或本地(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> 以允许本地执行。

另请参阅