如何解决如何使用EF的id获取大量数据?
我正在尝试使用entityframework获取项目。
我尝试过的是
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);
}
});
但是当我执行即时消息低于异常
InvalidOperationException: The connection was not closed. The connection's current state is connecting.
解决方法
我会尝试这样的事情:
var Idlist = results.Select(o => o.Document.Id); // 15000个IDs
各种数量= 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()
,
尝试像下面那样实现您的ID列表
var Idlist = results.Select(o => o.Document.Id).ToList();
此外,即使您确实在Parallel.ForEach中使用ToList,我也不认为EF能够使用相同的上下文处理并行操作,原因是您可能使用相同的上下文实例在以下位置运行多达4个不同的查询在同一时间。
您需要为每个线程创建一个新的上下文。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。