加快页面加载和信息处理

Hal*_*han 0 asp.net-mvc linq-to-sql

在我的Web应用程序上,我正在加载一个页面,该页面可以在表格中加载多达8000行或更多行,每行都有自己的下拉列表.第一个过程被证明是非常低效的,但我被要求这样做.加载行的代码如下:

 <tbody>
        <%  var i = 0;



            foreach (var row in Model)
            {
                var comp = "ok";
                if (row.LidExpected != (string.IsNullOrEmpty(row.LidObtained) ? null : row.LidObtained) || row.QuantityExpected != row.QuantityObtained)
                {
                    comp = "ko";
                }
                %>
        <tr class="child_row <%= comp %>">
            <input type="hidden" name="Goods.index" value="<%= i %>" />
            <td class="field <%= InventoryGoods.Metadata.Gid.CssClass %>">
              <%--  <%= Html.Encode(row.Gid) %>--%>
              <%--http://tecnicos.urbanos.com/Goods/Details/... --%>
               <%= Html.ActionLink(row.Gid, "Details", "Goods", new {id = row.Gid}, null) %>
                <%= Html.Hidden(String.Format("Record[{0}].Gid", i), row.Gid) %>
            </td>
            <td class="field <%= InventoryGoods.Metadata.LidExpected.CssClass %>">
                <%= Html.Encode(row.LidExpected) %>
                <%= Html.Hidden(string.Format("Record[{0}].LidExpected", i), row.LidExpected)%>
            </td>
            <td class="fieldRight <%= InventoryGoods.Metadata.QuantityExpected.CssClass %>">
                <%= Html.Encode(row.QuantityExpected) %>
                <%= Html.Hidden(string.Format("Record[{0}].QuantityExpected", i), row.QuantityExpected)%>
            </td>
            <td class="field <%= InventoryGoods.Metadata.LidObtained.CssClass %>">
                <%= Html.Encode(row.LidObtained) %>
                <%= Html.Hidden(string.Format("Record[{0}].LidObtained", i), row.LidObtained)%>
            </td>
            <td class="fieldRight <%= InventoryGoods.Metadata.QuantityObtained.CssClass %>">
                <%= Html.Encode(row.QuantityObtained) %>
                <%= Html.Hidden(string.Format("Record[{0}].QuantityObtained", i), row.QuantityObtained)%>
            </td>
             <%if (int.Parse(state.ToString()) == (int)InventoryStateEnum.Closed || int.Parse(state.ToString()) == (int)InventoryStateEnum.Verified)
               { %>
            <td class="field <%= InventoryGoods.Metadata.Action.CssClass %>">
                <%                        
                    switch (row.Action)
                    {
                        case (int)InventoryGoodsActionEnum.AdjustQuantity: %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {
                        new SelectListItem { Text= "Ajustar Quantidade", Value= ((int)InventoryGoodsActionEnum.AdjustQuantity).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantity == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                      <%      break;
                        case (int)InventoryGoodsActionEnum.AdjustLocation: %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {

                        new SelectListItem { Text= "Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocation == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                          <%  break;
                        case (int)InventoryGoodsActionEnum.AdjustStockType:  %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {                        
                        new SelectListItem { Text= "Ajustar Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustStockType == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                         <%   break;
                        case (int)InventoryGoodsActionEnum.AdjustQuantityLocation:  %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {
                        new SelectListItem { Text= "Ajustar Quantidade", Value= ((int)InventoryGoodsActionEnum.AdjustQuantity).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantity == row.Action ? true : false},
                        new SelectListItem { Text= "Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocation == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Quantidade e Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustQuantityLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantityLocation == row.Action ? true : false},                                                
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                          <%  break;
                        case (int)InventoryGoodsActionEnum.AdjustQuantityStockType: %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {
                        new SelectListItem { Text= "Ajustar Quantidade", Value= ((int)InventoryGoodsActionEnum.AdjustQuantity).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantity == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ajustar Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustStockType == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Quantidade e Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustQuantityStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantityStockType == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                         <%   break;
                        case (int)InventoryGoodsActionEnum.AdjustLocationStockType: %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {

                        new SelectListItem { Text= "Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocation == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ajustar Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustStockType == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ajustar Tipo de Stock e Relocalizar", Value = ((int)InventoryGoodsActionEnum.AdjustLocationStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocationStockType == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                         <%   break;
                        case (int)InventoryGoodsActionEnum.AdjustQuantityLocationStockType: %>
                             <%=    Html.DropDownList(String.Format("Record[{0}].Action", i), new[]
                    {
                        new SelectListItem { Text= "Ajustar Quantidade", Value= ((int)InventoryGoodsActionEnum.AdjustQuantity).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantity == row.Action ? true : false},
                        new SelectListItem { Text= "Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocation == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Quantidade e Relocalizar", Value= ((int)InventoryGoodsActionEnum.AdjustQuantityLocation).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantityLocation == row.Action ? true : false},                        
                        new SelectListItem { Text= "Ajustar Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustStockType == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Quantidade e Tipo de Stock", Value = ((int)InventoryGoodsActionEnum.AdjustQuantityStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantityStockType == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Tipo de Stock e Relocalizar", Value = ((int)InventoryGoodsActionEnum.AdjustLocationStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustLocationStockType == row.Action ? true : false},
                        new SelectListItem { Text= "Ajustar Quantidade, Tipo de Stock e Relocalizar", Value = ((int)InventoryGoodsActionEnum.AdjustQuantityLocationStockType).ToString(), Selected= (int)InventoryGoodsActionEnum.AdjustQuantityLocationStockType == row.Action ? true : false},
                        new SelectListItem { Text= "Ignorar", Value= ((int)InventoryGoodsActionEnum.Ignore).ToString(), Selected= (int)InventoryGoodsActionEnum.Ignore == row.Action ? true : false},
                    })%>
                        <%    break;
                    }


                %>
                <%= Html.Hidden(string.Format("db_Action[{0}]", i), row.Action)%>
            </td>
            <td>
                <a title="Apagar Evento" id="delete_Event" class="ui-widget ui-state-default ui-icon ui-icon-trash">
                </a>
            </td>
            <td class="field <%= InventoryGoods.Metadata.ActionOn.CssClass %>" id="dateCell">
                <span id="ActionOn_<%= i %>">
                    <%= Html.Encode(row.ActionOn.HasValue ? Html.FormatDateTime(row.ActionOn.Value) : Html.Encode(""))%></span>
                <%= Html.Hidden(String.Format("Record[{0}].ActionOn", i), row.ActionOn.HasValue ? row.ActionOn.Value : new DateTime())%>
            </td>
            <% } %>
            <%= Html.Hidden("lineVal", i) %>
            <%  i++;
            } %>
        </tr>
    </tbody>
Run Code Online (Sandbox Code Playgroud)

所以这是所有问题的根源.下一个问题是当我需要将这些数据发送回服务器时,这当然也会占用大量时间.我不知道有什么方法可以让它更快,因为它现在需要大约8或9分钟才能将9000行发送回服务器.

当我使用这些行进行批量更新时,问题仍然存在,如下所示:

public void UpdateInventoryGoods(List<InventoryGoods> list, int id)
        {
            //int index = 0;

            var query = from inventoryGoods in context.InventoryGoods
                        where inventoryGoods.ParentId == id
                        select inventoryGoods;

            List<InventoryGoods> goodsList = query.ToList();
            var memmoryInventoryGoodsEvent = context.InventoryGoodsEvents.ToList();//obter apenas o do Id

            using (var scope = new TransactionScope())
            {
                var events = from g in context.GoodsEvent
                             select g;
                List<GoodsEvent> goodsEventList = events.ToList();

                foreach (InventoryGoods i in list)
                {
                    foreach (InventoryGoods e in goodsList)
                    {
                        //if (index == 30)
                        //{
                        //    index = 0;
                        //    context.SubmitChanges();
                        //}
                        var eventId = getEventId(e.Id, memmoryInventoryGoodsEvent);
                        if (e.Gid == i.Gid && !eventId.HasValue && !e.ActionOn.HasValue)
                        {
                            e.Action = i.Action;

                        }
                        else if ((e.Gid == i.Gid && eventId.HasValue) && (e.Action != i.Action || i.ActionOn == DateTime.MinValue))
                        {
                            e.Action = i.Action;
                            e.ActionOn = null;



                            var inventoryGoodsEventsList = memmoryInventoryGoodsEvent.Where(x => x.InventoryGood == e.Id); 





                            foreach (InventoryGoodsEvents goodsEvent in inventoryGoodsEventsList)
                            {
                                context.InventoryGoodsEvents.DeleteOnSubmit(goodsEvent);

                                foreach (GoodsEvent ge in goodsEventList)
                                {
                                    if (ge.Id == goodsEvent.EventId)
                                    {
                                        ge.IsDeleted = true;
                                        ge.DeletedOn = DateTime.Now;
                                        ge.DeletedBy = System.Web.HttpContext.Current.User.Identity.Name;
                                    }
                                }
                            }




                        }
                        //++index;
                    }
                }
                context.SubmitChanges();
                scope.Complete();
            }

        }

   public int? getEventId(int InventoryGood,List<InventoryGoodsEvents> memmoryList)
        {
            //var firstinventoryGoodsEvents = context.InventoryGoodsEvents.Where(i => i.InventoryGood == InventoryGood).FirstOrDefault();
            var firstinventoryGoodsEvents = memmoryList.Where(i => i.InventoryGood == InventoryGood).FirstOrDefault();

            if (firstinventoryGoodsEvents != null && firstinventoryGoodsEvents.InventoryGood > 0)
            {
                return firstinventoryGoodsEvents.InventoryGood;

            }
            else
            {
                return null;
            }
        }
Run Code Online (Sandbox Code Playgroud)

上面的双foreach迭代中的i和e变量表示我从View中获取的行以及数据库中的行.我互相运行它们以发现任何差异,如果存在差异,请更新它们.但所有这些过程都证明太慢了,我真的需要快速改进.特别是双重foreach迭代,我找不到更好的解决方案.

那么你们有人可以帮助我吗?

编辑:我通过使用字典至少修复了更新方法并转义我在之前的代码中执行的双重foreach迭代,如下所示:

public void UpdateInventoryGoods(List<InventoryGoods> list, int id)
    {
        //int index = 0;

        var query = from inventoryGoods in context.InventoryGoods
                    where inventoryGoods.ParentId == id
                    select inventoryGoods;

        Dictionary<string, InventoryGoods> goodsDictionary = query.ToDictionary(p => p.Gid);
        var memmoryInventoryGoodsEvent = (from c in context.InventoryGoodsEvents
                                         join a in context.InventoryGoods on c.InventoryGood equals a.Id
                                         where a.ParentId == id
                                         select c).ToList();//obter apenas o do Id

        using (var scope = new TransactionScope())
        {
            var events = from g in context.GoodsEvent
                         select g;

            Dictionary<int, GoodsEvent> goodsEventDictionary = events.ToDictionary(p => p.Id);

            //List<GoodsEvent> goodsEventList = events.ToList();

            foreach (InventoryGoods i in list)
            {

                var eventId = getEventId(i.Id, memmoryInventoryGoodsEvent);

                var objectToUpdate = goodsDictionary[i.Gid];


                if (!eventId.HasValue && !objectToUpdate.ActionOn.HasValue)
                {
                    objectToUpdate.ActionOn = i.ActionOn;
                    continue;
                }
                else if (eventId.HasValue && objectToUpdate.Action != i.Action || i.ActionOn == DateTime.MinValue)
                {
                    objectToUpdate.Action = i.Action;
                    objectToUpdate.ActionOn = null;

                    var inventoryGoodsEventsList = memmoryInventoryGoodsEvent.Where(x => x.InventoryGood == objectToUpdate.Id);

                    foreach (InventoryGoodsEvents goodsEvent in inventoryGoodsEventsList)
                    {
                        context.InventoryGoodsEvents.DeleteOnSubmit(goodsEvent);

                        var eventToUpdate = goodsEventDictionary[goodsEvent.EventId];

                                eventToUpdate.IsDeleted = true;
                                eventToUpdate.DeletedOn = DateTime.Now;
                                eventToUpdate.DeletedBy = System.Web.HttpContext.Current.User.Identity.Name;                            
                    }

                }
            }
            context.SubmitChanges();
            scope.Complete();
        }

    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

两种选择:

  1. 说服客户分页是必要的,否则性能会受到影响.向他展示其他完善的网站是如何做到的.
  2. 使用AJAX.只加载屏幕上可以看到的内容,选择一个jQuery滚动插件,当用户滚动加载缺少的部分时使用AJAX.有点像Google Images.你也可以尝试一些开箱即用的控件,以避免繁重的工作.

无论您选择哪个选项,都可以使用帮助程序修复视图当前表示的标记汤.