2010-05-05 52 views
6

Trong môi trường .NET 4 và đa lõi, đối tượng datacontext sqq có tận dụng lợi thế của các giá trị song song mới nếu chúng ta sử dụng DataLoadOptions.LoadWith không?LinqToSql - Song song - DataContext và song song

EDIT

Tôi biết LINQ to SQL không parallelize truy vấn thông thường. Những gì tôi muốn biết là khi chúng tôi chỉ định DataLoadOption.LoadWith, nó có sử dụng song song để thực hiện khớp giữa mỗi thực thể và các thực thể con của nó không?

Ví dụ:

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

tạo ra sql sau:

Select Id,Name from Categories 
Select Id,Name, CategoryId from Products where p.SomeCondition 

khi tất cả các sản phẩm được tạo ra, chúng ta sẽ có một

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

hoặc

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

?

+0

Đừng quên gắn cờ câu trả lời yêu thích của bạn ;-) – Steven

+0

@Steven: Tôi đã hy vọng câu trả lời cho chỉnh sửa của mình ... – Gregoire

+0

Không có bất kỳ tối ưu hóa song song nào trong L2S. Xem cập nhật của tôi. – Steven

Trả lời

10

Không, LINQ to SQL thì không. Có rất ít để song song ở phía .NET. Tất cả LINQ to SQL đều dịch các cây biểu thức thành các truy vấn SQL. SQL Server sẽ thực hiện các câu lệnh SQL đó và có thể thực hiện điều này song song.

Đừng quên rằng trong khi bạn có thể làm một cái gì đó như thế này với LINQ to SQL LINQ truy vấn, nó không phải là một ý tưởng tốt:

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

Trong khi điều này mang lại kết quả chính xác, bạn sẽ không nhận được cải thiện hiệu suất mà bạn đang hy vọng. PLINQ không thể xử lý các đối tượng IQueryable. Vì vậy, nó sẽ chỉ xử lý một IQueryable như là một IEnumerable (do đó lặp nó). Nó sẽ xử lý song song bộ sưu tập db.Customers và sử dụng nhiều luồng để lọc khách hàng. Trong khi điều này nghe có vẻ ổn, điều này có nghĩa là nó sẽ lấy bộ sưu tập đầy đủ của khách hàng từ cơ sở dữ liệu! Nếu không có cấu trúc AsParallel, LINQ to SQL sẽ có thể tối ưu hóa truy vấn này bằng cách thêm WHERE id = @ID vào SQL. SQL Server sẽ có thể sử dụng các chỉ mục (và có thể là nhiều luồng) để tìm nạp các giá trị.

Trong khi có một số phòng để tối ưu hóa bên trong LINQ to SQL engine khi nói đến thực thể phù hợp với các thực thể con của nó, có vẻ như không tối ưu hóa trong khuôn khổ hiện tại (hoặc ít nhất, tôi đã không thể tìm thấy bất kỳ bằng cách sử dụng Reflector).

+0

Cảm ơn câu trả lời của bạn. Tôi biết điều này cho trường hợp cụ thể này. Những gì tôi muốn biết nó là những gì xảy ra khi dataloadoptions được quy định? – Gregoire

+0

Tôi xin lỗi. Tôi không chắc những gì bạn muốn biết. Theo tôi biết, LINQ to SQL sẽ không tăng tốc nội bộ bằng cách sử dụng các cấu trúc song song. Tất nhiên bạn được tự do thực hiện tối ưu hóa song song của riêng mình trong không gian .NET với PLINQ (đối tượng) khi LINQ to SQL được thực hiện tìm nạp. – Steven