性能问题:使用EF5从数据库加载数据,使用foreach循环

本文关键字:使用 数据 foreach 循环 加载 问题 EF5 性能 数据库 | 更新日期: 2023-09-27 18:09:03

我正在构建一个统计(多代理)应用程序,我使用EF5从代理表中检索代理列表。每次需要加载非常大量的数据(每个地区大约50,000个代理),以便对它们进行一些迁移逻辑。我发现(地区)。代理导航属性加载非常非常慢,但是,在Sql服务器上执行相同的查询只需要1秒。并且foreach也需要相当长的循环时间。

foreach (OrigineAgent origineAgent in new List<Agent> Origine.Agents.AsParallel()))
{
    origineAgent.ScoreCalculator = _container.Resolve<IScoreCalculator>();
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}

我必须做些什么来提高数据加载和循环性能?

性能问题:使用EF5从数据库加载数据,使用foreach循环

怎么样:

var resolved = _container.Resolve<IScoreCalculator>();
foreach (OrigineAgent origineAgent in Origine.Agents.ToList().AsParallel())
{
    origineAgent.ScoreCalculator = resolved
    origineAgent.AgentExoVariables = AgentVars;
    _migrationManager.Migrate(origineAgent);
}

我已经在循环之前移动了_container.Resolve<IScoreCalculator>();并固定了您的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());

并行调用_migrationManager.Migrate(origineAgent);