首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinqToSql -并行- DataContext和并行

LinqToSql -并行- DataContext和并行
EN

Stack Overflow用户
提问于 2010-05-05 19:25:22
回答 1查看 4.9K关注 0票数 7

在.NET 4和多核环境中,如果使用DataLoadOptions.LoadWith,linq对象是否利用了新的并行?

编辑

我知道linq不并行普通查询。我想知道的是,当我们指定DataLoadOption.LoadWith时,它是否使用并行化来执行每个实体及其子实体之间的匹配?

示例:

代码语言:javascript
复制
using(MyDataContext context = new MyDataContext())
{
     DataLaodOptions options =new DataLoadOptions();
     options.LoadWith<Product>(p=>p.Category);
     return this.DataContext.Products.Where(p=>p.SomeCondition);
}

生成以下sql:

代码语言:javascript
复制
Select Id,Name from Categories
Select Id,Name, CategoryId from Products where p.SomeCondition

当所有的产品都被创造出来了,我们会有一个

代码语言:javascript
复制
categories.ToArray();
Parallel.Foreach(products, p =>
{
    p.Category == categories.FirstOrDefault(c => c.Id == p.CategoryId);
});

代码语言:javascript
复制
categories.ToArray();
foreach(Product product in products)
{
    product.Category = categories.FirstOrDefault(c => c.Id == product.CategoryId);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-05 19:29:22

不,没有。在.NET端没有什么可并行化的。LINQ所做的全部工作是将表达式树转换为SQL查询。Server将执行这些SQL语句,并能够并行执行这些语句。

不要忘记,虽然您可以使用查询这样做,但这不是一个好主意:

代码语言:javascript
复制
// 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的任何优化)。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2776152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档