共用方式為


遠端和本機查詢執行的比較 (LINQ to SQL)

更新: November 2007

您可以決定執行查詢的方式為遠端 (也就是,資料庫引擎對資料庫執行查詢) 或本機 (LINQ to SQL 對本機快取執行查詢)。

遠端執行

請考慮下列查詢:

    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
            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.
}

如果資料庫有數千列訂單,當您只要處理一小部分的訂單時,您不會想要擷取出所有訂單。在 LINQ to SQL 中,EntitySet<TEntity> 類別 (Class) 會實作 IQueryable 介面。這種方法可以確認這類查詢可以遠端執行。這項技術的兩個主要優點是:

  • 不會擷取不必要的資料。

  • 因為利用資料庫索引,所以資料庫引擎執行的查詢通常會較具效率。

本機執行

在其他情況下,您可能會想要擁有本機快取中的完整一組相關實體 (Entity)。因此,EntitySet<TEntity> 提供 Load 方法,可以明確載入 EntitySet<TEntity> 的所有成員。

如果已載入 EntitySet<TEntity>,則會在本機執行後續查詢。這種方法有兩項優點:

  • 如果必須在本機或多次使用完整集合,則可以避免遠端查詢和相關的延遲時間。

  • 實體可以序列化為完整實體。

下列程式碼片段說明如何取得本機執行:

    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
            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.
}

        }

比較

這兩個功能可提供強大的選項組合:遠端執行適用於大型集合,而本機執行則適用於小型集合或需要完整集合之處。您可以透過 IQueryable 實作遠端執行,而本機執行則是根據記憶體中 IEnumerable<T> 集合來實作。若要強制使用本機執行 (即 IEnumerable<T>),請參閱 HOW TO:將型別轉換為泛型 IEnumerable (LINQ to SQL)

對未排序集合進行查詢

請注意下列兩者之間的重要差異:實作 List<T> 的本機集合,以及可針對關聯式資料庫中「未排序集合」(Unordered Set) 執行遠端查詢的集合。List<T> 方法 (如使用索引值的方法) 需要清單語意 (Semantics),而這一般無法透過對未排序集合的遠端查詢來取得。因此,這類方法會隱含地載入 EntitySet<TEntity>,以允許進行本機執行。

請參閱

其他資源

LINQ to SQL 的查詢概念