C# 使用EF5从数据库加载数据和使用foreach循环的性能问题

C# 使用EF5从数据库加载数据和使用foreach循环的性能问题,c#,performance,entity-framework,foreach,C#,Performance,Entity Framework,Foreach,我正在构建一个统计(多代理)应用程序,我正在使用EF5从代理表中检索代理列表。这是一个非常大的数据量(每个地区大约有50000个代理)需要一次加载,以便对他们进行一些移民逻辑。我发现(Region).Agents导航属性的加载速度非常慢,但是在Sql server上执行相同的查询只需1秒钟。而且foreach循环也需要相当长的时间 foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParall

我正在构建一个统计(多代理)应用程序,我正在使用EF5从代理表中检索代理列表。这是一个非常大的数据量(每个地区大约有50000个代理)需要一次加载,以便对他们进行一些移民逻辑。我发现(Region).Agents导航属性的加载速度非常慢,但是在Sql server上执行相同的查询只需1秒钟。而且foreach循环也需要相当长的时间

foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParallel()))
{
    origineAgent.ScoreCalculator = _container.Resolve<IScoreCalculator>();
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}
foreach(新列表Origine.Agents.aspallel()中的OrigineAgent)
{
origineAgent.ScoreCalculator=_container.Resolve();
origineAgent.agentexoviables=AgentVars;
_migrationManager.Migrate(origineAgent);
}
如何提高数据加载和循环性能?

如何:

var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
    origineAgent.ScoreCalculator = resolved
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}
var resolved=\u container.Resolve();
foreach(OrigineAgent OrigineAgent在Origine.Agents.ToList().aspallel()中)
{
origineAgent.ScoreCalculator=已解析
origineAgent.agentexoviables=AgentVars;
_migrationManager.Migrate(origineAgent);
}
我已经移动了
\u container.Resolve()在循环之前,修复了您的
foreach
循环源代码,因为您问题中的源代码甚至没有编译。

如何:

var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
    origineAgent.ScoreCalculator = resolved
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}
var resolved=\u container.Resolve();
foreach(OrigineAgent OrigineAgent在Origine.Agents.ToList().aspallel()中)
{
origineAgent.ScoreCalculator=已解析
origineAgent.agentexoviables=AgentVars;
_migrationManager.Migrate(origineAgent);
}

我已经移动了
\u container.Resolve()在循环之前,并修复了您的
foreach
循环源代码,因为您问题中的源代码甚至没有编译。

基于MarcinJuraszek上面的帖子,下面如何:

List<Task> tasks = new List<Task>();
var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
    origineAgent.ScoreCalculator = resolved
    origineAgent.AgentExoVariables = AgentVars;
    Task t = Task.Factory.StartNew((arg) => { _migrationManager.Migrate((OrigineAgent)arg); }, origineAgent);
    tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
List tasks=newlist();
var resolved=_container.Resolve();
foreach(OrigineAgent OrigineAgent在Origine.Agents.ToList().aspallel()中)
{
origineAgent.ScoreCalculator=已解析
origineAgent.agentexoviables=AgentVars;
Task t=Task.Factory.StartNew((arg)=>{u migrationManager.Migrate((OrigineAgent)arg);},OrigineAgent);
任务。添加(t);
}
Task.WaitAll(tasks.ToArray());

它并行调用
\u migrationManager.Migrate(origineAgent)

基于上面MarcinJuraszek的帖子,以下内容如何:

List<Task> tasks = new List<Task>();
var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
    origineAgent.ScoreCalculator = resolved
    origineAgent.AgentExoVariables = AgentVars;
    Task t = Task.Factory.StartNew((arg) => { _migrationManager.Migrate((OrigineAgent)arg); }, origineAgent);
    tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
List tasks=newlist();
var resolved=_container.Resolve();
foreach(OrigineAgent OrigineAgent在Origine.Agents.ToList().aspallel()中)
{
origineAgent.ScoreCalculator=已解析
origineAgent.agentexoviables=AgentVars;
Task t=Task.Factory.StartNew((arg)=>{u migrationManager.Migrate((OrigineAgent)arg);},OrigineAgent);
任务。添加(t);
}
Task.WaitAll(tasks.ToArray());

它并行调用
\u migrationManager.Migrate(origineAgent)

从循环中移出移动分数计算器从循环中移出移动分数计算器从循环中移出你是对的,但你的答案仍然没有从数据库中解决代理列表的性能问题如何启动_migrationManager.Migrate(originAgent)的单独任务并将任务实例存储在数组中。然后在该任务数组上的foreach循环调用WaitAll()结束时?您是对的,但是您的答案仍然没有解决数据库中代理列表的性能问题。为_migrationManager.Migrate(originAgent)启动一个单独的任务并将任务实例存储在数组中如何。然后在foreach循环结束时,对该任务数组调用WaitAll()?