linq 延遲執行帶來的困擾


有這樣一個案例:

            var filteredResult = from f in orgFileList select f;
            for (int i = 0; i < WorkStatusFilters.ListWorkStatus.Count; i++)
            {
               if( !WorkStatusFilters.ListWorkStatus[i].checkStatus)
                   filteredResult = filteredResult.Where(f => f.WorkStatusFlag != i.ToString());
            }

這段代碼的本意是篩選掉指定workstatusFlag的數據,但由於延遲執行的機制,使得該linq查詢結果至少在for循環結束后才真正的執行,而這個時候i作為局部變量已經取不到值了。本應該是如下的查詢:

 filteredResult = filteredResult.Where(f => f.WorkStatusFlag != "0").Where(f => f.WorkStatusFlag != "2").Where(f => f.WorkStatusFlag != "5");

實際結果卻是:

 filteredResult = filteredResult.Where(f => f.WorkStatusFlag != null ).Where(f => f.WorkStatusFlag != null).Where(f => f.WorkStatusFlag != null);

從而導致莫名的數據異常。

此處我的修正建議是:顯示調用 toList:

var filteredResult = from f in orgFileList select f;
            for (int i = 0; i < WorkStatusFilters.ListWorkStatus.Count; i++)
            {
               if( !WorkStatusFilters.ListWorkStatus[i].checkStatus)
                   filteredResult = filteredResult.Where(f => f.WorkStatusFlag != i.ToString()).ToList();
            }

但這樣做會犧牲一些性能,在大數據量時體現比較明顯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM