微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用EF的id获取大量数据?

如何解决如何使用EF的id获取大量数据?

我正在尝试使用entityframework获取项目。

我有15000个ID的集合,我需要所有这些项目的数量属性

我尝试过的是

       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 举报,一经查实,本站将立刻删除。