2010-05-05 63 views
6

在.NET 4和多核环境中,如果我们使用DataLoadOptions.LoadWith,linq to sql datacontext对象是否会利用新的并行?LinqToSql - 并行 - 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); 
} 

生成以下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 2010-06-22 11:33:37

+0

@Steven:我希望能回答我的编辑... – Gregoire 2010-06-22 13:43:51

+0

L2S内部没有任何并行优化。查看我的更新。 – Steven 2010-06-22 14:29:40

回答

10

不,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引擎中有一些优化的空间用于将实体与其子实体进行匹配,但目前在框架中似乎没有这样的优化(或者至少我无法找到任何使用反射器)。

+0

感谢您的回答。我知道这个具体情况。我想知道这是什么时dataloadoptions指定发生? – Gregoire 2010-05-05 19:57:50

+0

对不起。我不确定你想知道什么。据我所知,LINQ to SQL将不会通过使用并行结构来实现内部加速。当LINQ to SQL完成提取时,你可以自由地在PLINQ(对象)的.NET空间中进行自己的并行优化。 – Steven 2010-05-06 05:59:16