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

时间:2013-04-13 11:57:20

标签: c# performance entity-framework foreach

我正在构建统计信息(多代理)应用程序,我正在使用EF5从代理程序表中检索代理列表。这是一个非常大量的数据(每个区域有大约50 000个代理),需要一次加载以对它们进行一些移民逻辑。我发现(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);
}

我需要做些什么来增加数据加载和循环性能?

2 个答案:

答案 0 :(得分:2)

怎么样:

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循环源,因为你问题中的那个甚至都没有编译。

答案 1 :(得分:1)

基于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);

的调用并行化