gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:31:51 25 4
gpt4 key购买 nike

在 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com