我正在尝试通过在Datatable上使用LINQ来实现ASP.NET Repeater控件的分页。我希望此代码能够根据参数currentPage
和pageSize
返回一页行:
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确实包含DataRows。然而,在进行linq调用之后,List的计数为零,因此转发器始终绑定到allRecordsDataTable
。我误解了IEnumerable的工作原理吗?
P.S。 .orderby()
按日期时间列
答案 0 :(得分:4)
如果currentPage * pageSize
高于allRows
中的元素数,则pageOfRows中不会有任何记录。
Skip
将不会抛出异常。它只会返回一个空集。
来自MSDN:
如果source包含少于count个元素,则返回一个空的IEnumerable。
放置断点并检查pageOfRows
中的记录数和currentPage * pageSize
的结果。
(查看您的代码,这是最可能的原因。)
答案 1 :(得分:1)
您也可以使用orderbydescending而不是orderby然后反转
答案 2 :(得分:0)
可能currentPage * pageSize
大于allRows集合或pageSize
为0。