LinqToSql - 并行 - DataContext和Parallel

Gre*_*ire 7 parallel-processing datacontext .net-4.0 linq-to-sql

在.NET 4和多核环境中,如果我们使用DataLoadOptions.LoadWith,linq to sql 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);
}
Run Code Online (Sandbox Code Playgroud)

生成以下sql:

Select Id,Name from Categories
Select Id,Name, CategoryId from Products where p.SomeCondition
Run Code Online (Sandbox Code Playgroud)

当所有产品都被创建时,我们会有一个

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

要么

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

Ste*_*ven 13

不,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;
Run Code Online (Sandbox Code Playgroud)

虽然这会产生正确的结果,但您无法获得希望的性能提升.PLINQ无法处理IQueryable对象.因此,它只会处理IQueryable一个IEnumerable(因此迭代它).它将db.Customers并行处理集合并使用多个线程来过滤客户.虽然听起来不错,但这意味着它将从数据库中检索完整的客户集合!如果没有该AsParallel构造,LINQ to SQL将能够通过添加WHERE id = @ID到SQL 来优化此查询.SQL Server将能够使用索引(可能还有多线程)来获取值.

虽然LINQ to SQL引擎在将实体匹配到其子实体时仍有一些优化空间,但目前在框架中似乎没有这样的优化(或者至少,我无法使用Reflector找到任何优化) ).