2014-01-16 38 views
0

我試圖通過在Datatable上使用LINQ在ASP.NET Repeater控件上實現分頁。我希望這段代碼給我回基於參數currentPagepageSize行的頁面:在IEnumerable上調用LINQ方法的結果爲空列表

IEnumerable<DataRow> allRows = allRecordsDataTable.AsEnumerable(); 
List<DataRow> pageOfRows = new List<DataRow>(); 

if (allRows.Any()) 
{ 
    pageOfRows = allRows 
     .OrderBy(dr => dr[3]) 
     .Reverse() 
     .Skip(currentPage * pageSize) 
     .Take(pageSize) 
     .ToList(); 
} 

if (pageOfRows.Count > 0) 
    repeater.DataSource = pageOfRows.CopyToDataTable(); 
else 
    repeater.DataSource = allRecordsDataTable; 

代碼落入if塊,所以IEnumerable的確實包含數據行。然而,在進行linq調用之後,列表的計數爲零,因此中繼器總是綁定到allRecordsDataTable。我誤解了IEnumerable的工作原理嗎?

P.S. .orderby()按日期時間排序

+0

這可能是'.Skip'。 –

+0

如果'currentPage * pageSize'高於'allRows'中的元素數量,那麼'pageOfRows'中不會有任何記錄,因爲如果您無意中「跳過」了所有記錄,Skip'不會拋出異常。 –

回答

3

如果currentPage * pageSize高於allRows中的元素數,那麼在pageOfRows中將不會獲得任何記錄。

Skip如果您無意中「跳過」了所有記錄,則不會拋出異常。它只會返回一個空集。

MSDN

如果源包含少於計數的元件,則返回一個空的IEnumerable。

放置一個斷點並檢查pageOfRows中的記錄數和currentPage * pageSize的結果。

(你的代碼來看,這是最有可能的原因。)

1

你也可以改用orderbydescending排序依據,然後反向

0

它可以是currentPage * pageSize比allRows集合或更大pageSize爲0.

相關問題