【问题标题】:Calling LINQ methods on IEnumerable results in empty List在 IEnumerable 上调用 LINQ 方法会导致空列表
【发布时间】:2014-01-16 17:48:24
【问题描述】:

我正在尝试通过在数据表上使用 LINQ 在 ASP.NET 中继器控件上实现分页。我希望这段代码能根据参数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 的工作原理?

附: .orderby() 按日期时间列排序

【问题讨论】:

  • 可能是.Skip

标签: c# asp.net .net linq


【解决方案1】:

如果currentPage * pageSize 大于allRows 中的元素数,您将不会在pageOfRows 中获得任何记录。

如果您无意中“跳过”了所有记录,Skip 不会抛出异常。它只会返回一个空集。

来自MSDN

如果 source 包含的元素少于 count 个,则返回一个空的 IEnumerable。

下断点,检查pageOfRows的记录数和currentPage * pageSize的结果。

(查看您的代码,这是最可能的原因。)

【讨论】:

    【解决方案2】:

    你也可以使用 orderbydescending 代替 orderby 然后反向

    【讨论】:

      【解决方案3】:

      它可能是 currentPage * pageSize 大于 allRows 集合或 pageSize 为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多