簡體   English   中英

在 C# 中使用虛擬集合使代碼更高效

[英]Using virtual collection in C# to make code more efficient

你好,我有一個看起來像這樣的模型,

  public class Site
    {
        public int ID { get; set; }

        public string Name { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Province { get; set; }
        public string PostalCode { get; set; }

        public virtual ICollection<OffSiteItemDetails> ItemDetails { get; private set; }
        public virtual ICollection<SalesOrder> soDetails { get; private set; }
        public virtual ICollection<SODetails> SODDetails { get; private set; }

        public string IncomingTotalOSI(Site s)
        {
            PIC_Program_1_0Context db = new PIC_Program_1_0Context();
            float? partCost = 0;
            float? componentCost = 0;
            float? itemCost = 0;
            float? incomingCost = 0;
            List<OffSiteItemDetails> d = ItemDetails.Where(x => x.siteID == s.ID).ToList();


            var less30days = DateTime.Now.AddDays(-30);
            //List<SalesOrder> so = soDetails.Where(x => x.OrderType == SOType.OffSiteInventory).Where(x => x.DateCreated > less30days).ToList();
            List<SalesOrder> so = db.SalesOrders.Where(x => x.OrderType == SOType.OffSiteInventory).Where(x => x.DateCreated > less30days).ToList();
            List<SODetails> sod = db.SODetails.Where(x => x.SiteID == s.ID).ToList();

       foreach (var order in so)
        {

            foreach (var details in sod)
            {

                if (order.ID == details.SalesOrderID)
                {

                    if (details.PartID != null){
                        partCost += details.part_qty * db.Parts.Where(x => x.ID == details.PartID).FirstOrDefault().AveCostPerUnit;
                    }
                    else if (details.ComponentID != null){
                        componentCost += details.comp_qty * db.Components.Where(x => x.ID == details.ComponentID).FirstOrDefault().AveCostPerUnit;
                    }
                    else{
                        itemCost += details.item_qty * db.Items.Where(x => x.ID == details.ItemID).FirstOrDefault().CostPerUnit;
                    }
                }

            }
        }
        incomingCost = partCost + componentCost + itemCost;

            string cost = String.Format("{0:C}", incomingCost);

            return cost;
        }
  }

但這效率低下,因為它多次循環訪問同一數據集。 並且添加的訂單越多,程序就會變得越慢。 我仍在學習 MVC 並研究了虛擬集合,但我仍然對如何在這種情況下提高程序效率感到困惑

首先,我建議從這一行中刪除.ToList()

List sod = db.SODetails.Where(x => x.SiteID == s.ID).ToList();

當您在那里使用 ToList() 時,您將在該點強制對基礎數據存儲進行執行和枚舉,而不是推遲執行,直到您確實需要枚舉所需的結果。

然后更改以下行:

foreach (var details in sod)

到:

foreach (var details in db.SODetails .Where(x => x.SiteID == s.ID && details.SalesOrderID == order.ID))

當然,權衡是您通過查詢每個銷售訂單來訪問數據庫,但您不會多次迭代相同的數據。

您還可以去掉最內層循環中的 if() 語句,只需將您的條件放在 Linq 中以限制循環的內容。 這也可以提高性能:

foreach (var details in sod.Where(detail => detail.SalesOrderID == order.ID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM