linq-to-sql - LinqToSql - 并行 - DataContext 和并行

标签 linq-to-sql .net-4.0 parallel-processing datacontext

在 .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);
}

生成以下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);
}

?

最佳答案

不,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 )。

关于linq-to-sql - LinqToSql - 并行 - DataContext 和并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776152/

相关文章:

.net - Linq to SQL 仍然是开发应用程序的可行选择吗?

c# - 使用 LINQ to SQL 将具有外键的 Gridview 列排序到不同的实体

ASP.NET MembershipProvider 加密/解密

c# - 如何使用 System.Threading.Parallel (.Net 4.0) 增加并发并行任务

r - 在 `parallel` 中使用 `boot` 函数的 `R` 选项

bash - 如何使用 GNU parallel 在巨大的数据集上并行化包含嵌套 for 循环的 bash 脚本?

linq to sql 批量删除

c# - 将组合框显示文本设置为 ObservableCollection<T> 的属性

parallel-processing - C++parallel_reduce如何使用初始值参数?

c# - 同一 LINQ 2 SQL 方法中的多个 WHERE