2010-05-05 56 views
6

在.NET 4和多核環境中,如果我們使用DataLoadOptions.LoadWith,linq to sql datacontext對象是否會利用新的並行?LinqToSql - 並行 - DataContext和並行

編輯

我知道LINQ to SQL的不普通的並行查詢。我想知道的是,當我們指定DataLoadOption.LoadWith時,它是否使用並行化來執行每個實體與其子實體之間的匹配?

實施例:

using(MyDataContext context = new MyDataContext()) 
{ 
    DataLaodOptions options =new DataLoadOptions(); 
    options.LoadWith<Product>(p=>p.Category); 
    return this.DataContext.Products.Where(p=>p.SomeCondition); 
} 

生成以下SQL:

Select Id,Name from Categories 
Select Id,Name, CategoryId from Products where p.SomeCondition 
時創建的所有產品

,我們將有一個

categories.ToArray(); 
Parallel.Foreach(products, p => 
{ 
    p.Category == categories.FirstOrDefault(c => c.Id == p.CategoryId); 
}); 

categories.ToArray(); 
foreach(Product product in products) 
{ 
    product.Category = categories.FirstOrDefault(c => c.Id == product.CategoryId); 
} 

+0

不要忘記標記您最喜歡的答案;-) – Steven 2010-06-22 11:33:37

+0

@Steven:我希望能回答我的編輯... – Gregoire 2010-06-22 13:43:51

+0

L2S內部沒有任何並行優化。查看我的更新。 – Steven 2010-06-22 14:29:40

回答

10

不,LINQ to SQL沒有。在.NET方面幾乎沒有什麼可以並行的。所有LINQ to SQL都在將表達式樹轉換爲SQL查詢。 SQL Server將執行這些SQL語句,並能夠並行執行此操作。

不要忘了,當你可以做這樣的事情與你的LINQ to SQL LINQ查詢,它是不是一個好主意:

// BAD CODE!!! Don't parallelize a LINQ to SQL query 
var q = 
    from customer in db.Customers.AsParallel() 
    where customer.Id == 5 
    select customer; 

雖然這會產生正確的結果,你不會獲得您期望的績效提升。 PLINQ無法處理IQueryable對象。因此,它將僅處理IQueryable作爲IEnumerable(因此重複它)。它將並行處理db.Customers集合,並使用多個線程來過濾客戶。雖然這聽起來不錯,但這意味着它會從數據庫中檢索完整的客戶集合!如果沒有AsParallel構造,LINQ to SQL將能夠通過將WHERE id = @ID添加到SQL來優化此查詢。 SQL Server將能夠使用索引(可能還有多線程)來獲取值。

雖然在LINQ to SQL引擎中有一些優化的空間用於將實體與其子實體進行匹配,但目前在框架中似乎沒有這樣的優化(或者至少我無法找到任何使用反射器)。

+0

感謝您的回答。我知道這個具體情況。我想知道這是什麼時dataloadoptions指定發生? – Gregoire 2010-05-05 19:57:50

+0

對不起。我不確定你想知道什麼。據我所知,LINQ to SQL將不會通過使用並行結構來實現內部加速。當LINQ to SQL完成提取時,你可以自由地在PLINQ(對象)的.NET空間中進行自己的並行優化。 – Steven 2010-05-06 05:59:16