Dev*_*net -1 .net c# linq asp.net-mvc entity-framework
我有以下代码,其中使用 tolist 方法将数据从数据库转换为列表。我必须将整个数据转换为列表的原因是,我必须在使用 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();
}
Run Code Online (Sandbox Code Playgroud)
dom*_*omi 10
在您的示例中,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();
Run Code Online (Sandbox Code Playgroud)
这会将您的条件附加到IQueryable一旦您调用.ToList(),最终将得到解决,这意味着您不必将所有实体加载到内存中,因为过滤器将在数据库中进行评估。
| 归档时间: |
|
| 查看次数: |
1128 次 |
| 最近记录: |