我有以下代碼,其中我使用 tolist 方法將我的資料從 db 轉換為串列。我必須將整個資料轉換為串列的原因是,我必須在使用 where 和 lambda 陳述句之后執行搜索操作,為此我們需要串列。
有沒有其他選擇?
// This takes less than 2 seconds to execute
var wdata = (from s in db.VIEW_ADDED_LOT
select new LotModel
{
CREATION_DATE = s.CREATION_DATE,
LOT_NO_SPL = s.LOT_NO_SPL,
LOT_TYPE = s.LOT_TYPE,
ITEM = s.ITEM,
BUSINESS_UNIT = s.BUSINESS_UNIT,
INSPECTOR = s.INSPECTOR,
NCRNO = s.NCRNO,
BUILDING_NO = s.BUILDING_NO,
CELL = s.CELL,
NCR_DT = s.NCR_DT,
INVENTORY_ROUTER = s.INVENTORY_ROUTER,
DOC_ISSUE = s.DOC_ISSUE,
COMMENTS = s.COMMENTS,
AGING = s.AGING,
ARCHIVAL_DATE = s.ARCHIVAL_DATE,
NCR_COMPLETION_STATUS = s.NCR_COMPLETION_STATUS,
FLAG_LINK = s.FLAG_LINK,
P_KEY = s.P_KEY
});
// This takes around 1 minute to convert to list as there is 500 000 rows
var data = wdata.ToList();
// The reason why I am converting to list is that I have to perform n number of
// search on the basis of the filter chosen by user
if (NCR != null && NCR != "")
{
data = data.Where(a => a.NCRNO == NCR).ToList();
}
if (LOT != null && LOT != "")
{
data = data.Where(a => a.LOT_NO_SPL == LOT).ToList();
}
uj5u.com熱心網友回復:
在您的示例中,wdata.ToList()呼叫評估查詢并將整個加載wdata到記憶體中。您的初始分配wdata只創建一個IQueryable物件,它實際上并不查詢資料庫。
為避免性能下降,您應該將所有過濾器應用于最后IQueryable,然后呼叫ToList(),例如:
var data = wdata; // at this point its a queryable of your initial linq
if (NCR != null && NCR != "")
{
data = data.Where(a => a.NCRNO == NCR); // appends one filter condition
}
if (LOT != null && LOT != "")
{
data = data.Where(a => a.LOT_NO_SPL == LOT); // appends another filter condition
}
var finalResult = data.ToList();
這會將您的條件附加到IQueryable最終將在您呼叫后得到解決的條件.ToList(),這意味著您不必將所有物體加載到記憶體中,因為過濾器將在資料庫中進行評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/430888.html
標籤:C# 。网 asp.net-mvc 实体框架 林克
