[英]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.