Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用id'获取海量数据;谁在使用EF?_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 如何使用id'获取海量数据;谁在使用EF?

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

我正在尝试使用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);
                }
            });

如何解决此问题?用较少的时间获取项目的最佳方法是什么?

我会尝试以下方法:

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应该尝试一下,并最终比较性能。这看起来可能比我的答案更好。希尔达·索尼卡·维什应该尝试一下,并最终比较性能。