在.NET 4和多核环境中,如果使用DataLoadOptions.LoadWith,linq对象是否利用了新的并行?
编辑
我知道linq不并行普通查询。我想知道的是,当我们指定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);
}发布于 2010-05-05 19:29:22
不,没有。在.NET端没有什么可并行化的。LINQ所做的全部工作是将表达式树转换为SQL查询。Server将执行这些SQL语句,并能够并行执行这些语句。
不要忘记,虽然您可以使用查询这样做,但这不是一个好主意:
// 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将能够通过将WHERE id = @ID添加到SQL来优化该查询。Server将无法使用索引(可能还有多个线程)来获取值。
虽然在LINQ引擎中有一些优化空间,当涉及到将实体匹配到其子实体时,目前框架中似乎没有这样的优化(或者至少,我无法找到使用Reflector的任何优化)。
https://stackoverflow.com/questions/2776152
复制相似问题