这段代码有时可以处理一些项目,但当尝试处理更多项目时,它总是会失败,会得到这个异常:{"The underlying provider failed on Open."}
List<Recon> scenarioAll = db.Transactions
.Where(t => t.SrcObjTyp == "13")
.Select(t => t.Recon).ToList();
//db.Transactions.Where(t => t.SrcObjTyp == "13").ToList().ForEach(t => reconsWithType13Trans.Add(t.Recon));
Parallel.ForEach(scenarioAll.Take(100), r =>
{
// ### Exception : {"The underlying provider failed on Open."} here ###
invoices = r.Transactions.SelectMany(t => t.InvoiceDetails).ToList();
CreateFacts(invoices, r/*, db*/).ForEach(f => facts.Add(f));
transactions = r.Transactions.Where(t => !t.SrcObjTyp.Contains("13")).ToList();
DistributeTransactionOnItemCode(transactions, facts);
Console.WriteLine(i += 1);
});
facts.ForEach(f => db.ReconFacts.Add(f));
db.SaveChanges();
我认为问题在于多个进程同时访问数据库,是否有可能允许EF通过这种方式被多个进程查询?
还有一种方法是将所有内容加载到内存中,这样当访问Recon
的子级时,例如r.Transactions.SelectMany(t => t.InvoiceDetails).ToList();
,所有内容都将在内存中,而不是访问底层数据库?
你认为应该使用什么解决方案?你认为哪个最好?
.Take(100)
应该在.ToList()
之前...现在你正在从数据库中取出所有数据,然后迭代前100个... 你真正想要的是只请求100行数据。 - Aron