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找到任何优化) ).