Performance issue when performing operations on entity objects

馋奶兔 提交于 2021-01-29 18:51:15

问题


Im facing performance issue in below code in multiple foreach loops. First im getting a list of ReturnDetails and then based on detail id get the HandlingInfo object. Then based on value of action, update the ReturnsDetail Object again.

It take more than a minute for loading 3000 records of ReturnsDetail. While debugging locally, it runs for infinite amount of time.

Please let me know in anyway i can refactor this code .

Thanks for your help.

 lstReturnsDetail = dcReturnsService.GetReturnDetailsInfo(header_id);

 List<HandlingInfo> lstHandlingInfo = null;
 foreach (ReturnsDetail oReturnsDetail in lstReturnsDetail)
 {
     using (DCReturns_Entities entities = new DCReturns_Entities())
     {
         lstHandlingInfo = entities.HandlingInfoes.Where(f => f.detail_id == oReturnsDetail.id).ToList();
         if(lstHandlingInfo != null)
         {
             foreach (HandlingInfo oHandlingInfo in lstHandlingInfo)
             {
                 if (oHandlingInfo.action == "DST")
                 {
                     oReturnsDetail.destroy += Convert.ToInt32(oHandlingInfo.qty);
                 }
                 else if (oHandlingInfo.action == "SHP")
                 {
                     oReturnsDetail.to_shop += Convert.ToInt32(oHandlingInfo.qty);
                 }
                 else if (oHandlingInfo.action == "RBX")
                 {
                     oReturnsDetail.in_stock += Convert.ToInt32(oHandlingInfo.qty);
                 }
             }
         }
     }

     oReturnsDetail.received_qty = oReturnsDetail.destroy + oReturnsDetail.to_shop + oReturnsDetail.in_stock;
 }

 dgReturnsDetail.DataSource = lstReturnsDetail.OrderByDescending(g => g.id).ToList();
 Session[DCReturnsConstants.Returns_Detail_Entity] = lstReturnsDetail;
 dgReturnsDetail.DataBind();

回答1:


this is su-do code! but you should get the jist.

//modify this to return all of them into mem, and then filter on this... 
//if it can not be done here then do below..
var lstReturnsDetail = dcReturnsService.GetReturnDetailsInfo(header_id);

//then create a list here which fetches all, 
List<[type]> somelist
List<int> listId = lstReturnsDetail.select(x=>x.id).tolist();
using (var db = new DCReturns_Entities())
{
    somelist = db.HandlingInfoes.Where(f =>  listId.Contains(  f.detail_id)).ToList();
}

foreach (ReturnsDetail oReturnsDetail in lstReturnsDetail)
{
    //performance issue is here
    //using (DCReturns_Entities entities = new DCReturns_Entities())
    //{
    //  lstHandlingInfo = entities.HandlingInfoes.Where(f => f.detail_id == oReturnsDetail.id).ToList();
    //} 

    //insead fetach all before, into mem and filter from that list.
    var lstHandlingInfo = somelist.Where(f => f.detail_id == oReturnsDetail.id).ToList();

    //code ommited for reaablity
}
//code ommited for reaablity


来源:https://stackoverflow.com/questions/59624767/performance-issue-when-performing-operations-on-entity-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!