【问题标题】:Parallel EntityFramework并行实体框架
【发布时间】:2010-04-28 11:13:29
【问题描述】:

以下示例是否可以与实体框架并行工作?

using (var dbContext = new DB())
{
var res = (from c in dbContext.Customers
           orderby c.Name
           select new
                    {
                    c.Id, 
                    c.Name,
                    c.Role
                    }
          ).ToDictionary(c => c.Id,
                         c => new Dictionary<string, object> {
                                                               { "Name",c.Name },
                                                               { "Role", c.Role }
                                                             });
}

例如,如果我添加 AsParrallel,会发生什么变化?

using (var dbContext = new DB())
{
var res = (from c in dbContext.Customers
           orderby c.Name
           select new
                    {
                    c.Id, 
                    c.Name,
                    c.Role
                    }
          ).AsParallel().ToDictionary(c => c.Id,
                         c => new Dictionary<string, object> {
                                                               { "Name",c.Name },
                                                               { "Role", c.Role }
                                                             });
}

还有一个例子。问题是一样的,3个例子有什么区别。

using (var dbContext = new DB()) 
{ 
var res = (from c in dbContext.Customers.AsParallel() 
           orderby c.Name 
           select new 
                    { 
                    c.Id,  
                    c.Name, 
                    c.Role 
                   } 
          ).AsParallel().ToDictionary(c => c.Id, 
                         c => new Dictionary<string, object> { 
                                                               { "Name",c.Name }, 
                                                               { "Role", c.Role } 
                                                             }); 
} 

【问题讨论】:

  • 您为什么要这样做?该查询将从并行化中获得零收益,即使它有效。它可能会运行更慢。
  • @CraigStuntz 请提供您对这篇文章的意见opinionsharepoint.blogspot.com/2019/06/…

标签: c# entity-framework parallel-processing


【解决方案1】:

不,查询是在数据库上运行的,而不是在客户端上。数据库可能会使用多个线程进行查询以加快处理速度,但无论如何您都不能将服务器端处理与客户端并行扩展结合起来。

【讨论】:

  • 在这种情况下,两个例子有什么区别?
  • 我不确定。 AsParallel() 要么会抛出异常,要么不会改变可枚举。
  • 所以它什么也不做。如果您在谈论对象的本地集合,那么它将很有用,并且可能会减少执行查询所需的时间。但是在您的情况下,当这一切都发生在其他地方(在数据库上)时,并行扩展几乎无能为力。
  • 是的,数据库端没有并行操作。但是,如果查询返回大量结果,则使用 AsParallel 创建字典会更快。但在调试中我没有看到任何并行线程。那么在这种情况下,AsParallel 什么都不做?
  • Dictionary 类不是线程安全的,所以 PE 不能并行插入项目,所以 AsParallel 在这种情况下确实什么都不做。并且在数据库端也有并行的动作,但是和PE无关,都是自动完成的。
【解决方案2】:

您可以使用 PLINQ(并行 LINQ)

http://msdn.microsoft.com/en-us/library/dd460688.aspx

http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

例如(从上面):

IEnumerable 数据 = ...;变量 q = data.AsParallel().Where(x => p(x)).Orderby(x => k(x)).Select(x => f(x));

foreach (var e in q) a(e);

对于 foreach,您也可以使用 TPL(任务并行库)版本。 http://msdn.microsoft.com/en-us/library/dd460717(v=VS.100).aspx

【讨论】:

  • 是否可以将 PLINQ 用于 EntityFramework?它不是真正的应用程序。我想了解理论上的示例差异吗?它将如何运作?是否会创建一些线程?
  • @mehanik 我认为不可能让它在 Sql Server 上运行。我认为 PLinq 只是内存上可枚举类型的扩展。无法从客户端管理服务器端处理。这是我的看法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多