在IEnumerable上调用LINQ方法导致空List

时间:2014-01-16 17:48:25

标签: c# asp.net .net linq

我正在尝试通过在Datatable上使用LINQ来实现ASP.NET Repeater控件的分页。我希望此代码能够根据参数currentPagepageSize返回一页行:

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()按日期时间列

排序

3 个答案:

答案 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。