在循环中访问数据库

本文关键字:数据库 访问 循环 | 更新日期: 2023-09-27 18:09:58

我正在进入数据库循环。请告诉我怎样才能避免这种情况?

 foreach (var assignedPricing in reviewingPricing)
      {
                    var assignedUserId = _wfActivitySvc.GetPricingReviewer(assignedPricing.PricingID).UserId;
                    if (assignedUserId == UserId)
                       {
                          reviewingAssignedPricings.Add(assignedPricing);
                       }
      }

在循环中访问数据库

在数据库服务中创建一个新查询:

//Build an collection with just unique ids
var priceIds = reviewingPricing.Select(x => x.PricingId).Distinct();
//Return a key/value collection with all priceId/UserId
var reviewerMap = _wfActivitySvc.GetAllReviewersByPriceId(priceIds);
//now you can loop without db queries
foreach (var pricing in reviewingPricing)
{
    var reviewer = reviewMap.FirstOrDefault(x => x.PricingId == pricing.PricingId);
    if (reviewerMap == null)
        continue;
    if (reviewer.UserId == UserId)
    {
       reviewingAssignedPricings.Add(pricing);   
    }
}

1)您可能希望一次插入所有记录。您可以创建存储过程来实现这一点。如果您使用SQL server,您可以使用BulkInserter类:https://github.com/ronnieoverby/RonnieOverbyGrabBag/blob/master/BulkInserter.cs对于生产,我不得不在内部稍微调整一下以减少初始化时间,但对于不频繁的批量插入,Github版本就可以了。使用例子:

var bulkInserter = new BulkInserter<YourClass>(SqlConnection, "Table Name");
bulkInserter.Insert(reviewingAssignedPricings);
bulkInserter.Flush();

2)如果每次都从数据库读取

_wfActivitySvc.GetPricingReviewer(assignedPricing.PricingID).UserId;

然后将其替换为循环外的单个调用,从数据库中获取所有审阅者,然后添加到字典(key = priceID, value =审阅者),然后在循环内从字典中获取审阅者。如果您使用简单的List和. firstordefault(),那么对于列表中的100多个项目,它可能会明显变慢。Jgauffin的回答描述了这个想法。