2010-05-05 4 views
6

В .NET 4 и многоядерной среде объект linq to sql datacontext использует новые параллели, если мы используем DataLoadOptions.LoadWith?LinqToSql - Параллельный - DataContext и Parallel

EDIT

Я знаю, что LINQ к 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

+0

@Steven: Я надеялся на ответы на мои изменения ... – Gregoire

+0

Нет никакой параллельной оптимизации того, что когда-либо было внутри L2S. См. Мое обновление. – Steven

ответ

10

Нет, LINQ to SQL этого не делает. На стороне .NET мало что можно распараллелить. Все LINQ to SQL делает перевод деревьев выражений на SQL-запросы. SQL Server выполнит эти SQL-запросы и сможет сделать это параллельно.

Не стоит забывать, что в то время как вы можете сделать что-то подобное с помощью LINQ к 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 имеется некоторое пространство для оптимизации, когда речь идет о сопоставлении сущностей с его сущностями, в настоящее время такая оптимизация в структуре отсутствует (или, по крайней мере, я не смог найдите любой, используя Reflector).

+0

Спасибо за ваш ответ. Я знал это по этому конкретному делу. Что я хотел бы знать, так это то, что происходит, когда указаны dataloadoptions? – Gregoire

+0

Прошу прощения. Я не уверен, что вы хотите знать. Насколько я знаю, LINQ to SQL не будет делать внутреннего ускорения с помощью параллельных конструкций. Конечно, вы свободны делать свою параллельную оптимизацию в пространстве .NET с PLINQ (для объектов), когда LINQ to SQL выполняется. – Steven

Смежные вопросы