有這樣一個案例:
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(); }
但這樣做會犧牲一些性能,在大數據量時體現比較明顯。