LinqToSql - Parallel - DataContext и Parallel - PullRequest
7 голосов
/ 05 мая 2010

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

EDIT

Я знаю, что 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);
}

1 Ответ

13 голосов
/ 05 мая 2010

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

...