C# 如何使用id'获取海量数据;谁在使用EF?
我正在尝试使用entityframework获取项目 我收集了15000个ID,我需要所有这些项目的金额属性 我试过的是C# 如何使用id'获取海量数据;谁在使用EF?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试使用entityframework获取项目 我收集了15000个ID,我需要所有这些项目的金额属性 我试过的是 var Idlist = results.Select(i => i.Document.Id); //15000 ids var amounts = new ConcurrentBag<Decimal>(); Parallel.ForEach(Idlist, new ParallelOptions
var Idlist = results.Select(i => i.Document.Id); //15000 ids
var amounts = new ConcurrentBag<Decimal>();
Parallel.ForEach(Idlist, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (item) =>
{
var amount = this.AuctionResults.Where(j => j.Id == item).FirstOrDefault();
if(amount != null && amount.Amount.HasValue)
{
amounts.Add(amount.Amount.Value);
}
});
如何解决此问题?用较少的时间获取项目的最佳方法是什么?我会尝试以下方法: var Idlist=results.Select(o=>o.Document.Id)//15000 ID var amounts=this.AuctionResults.Where(o=>Idlist.Contains(o.Id)).ToList()
//下一步处理金额时,我会尝试以下方法: var Idlist=results.Select(o=>o.Document.Id)//15000 ID var amounts=this.AuctionResults.Where(o=>Idlist.Contains(o.Id)).ToList()
//下一步处理的金额我同意马丁的观点。不确定在for循环中没有真正执行任何CPU密集型工作时,为什么要尝试使用Parallel.ForEach。所以像这样的事情应该是好的:
//15000 ids
var Idlist = results.Select(o => o.Document.Id);
var amounts = this.AuctionResults
.Where(o => Idlist.Contains(o.Id) && o.Amount.HasValue)
.Select(x => x.Amount.Value)
.ToList()
我同意马丁的看法。不确定在for循环中没有真正执行任何CPU密集型工作时,为什么要尝试使用Parallel.ForEach。所以像这样的事情应该是好的:
//15000 ids
var Idlist = results.Select(o => o.Document.Id);
var amounts = this.AuctionResults
.Where(o => Idlist.Contains(o.Id) && o.Amount.HasValue)
.Select(x => x.Amount.Value)
.ToList()
尝试具体化您的Id列表,如中所示
var Idlist = results.Select(o => o.Document.Id).ToList();
此外,我认为即使在parallel.ForEach中使用ToList,EF也无法使用相同的上下文处理并行操作,因为您可能会使用相同的上下文实例同时运行多达4个不同的查询
您需要为每个线程创建一个新的上下文。尝试具体化您的Id列表,如中所示
var Idlist = results.Select(o => o.Document.Id).ToList();
此外,我认为即使在parallel.ForEach中使用ToList,EF也无法使用相同的上下文处理并行操作,因为您可能会使用相同的上下文实例同时运行多达4个不同的查询
您需要为每个线程创建一个新的上下文。我非常确定一个查询比15000个查询更好……我非常确定一个查询比15000个查询更好……这看起来可能比我的答案更好。hilda_sonica_vish应该尝试一下,并最终比较性能。这看起来可能比我的答案更好。希尔达·索尼卡·维什应该尝试一下,并最终比较性能。