【问题标题】:Can i use DataTable.Select() method to make simple paging?我可以使用 DataTable.Select() 方法进行简单的分页吗?
【发布时间】:2013-03-06 19:36:57
【问题描述】:

我很快查看了这篇 MSDN 文章using datacolumn.expression,但一无所获。看起来“选择表达式”语法不支持分页...

【问题讨论】:

  • 你指的是什么文章?
  • * 固定文章链接。
  • 我刚刚给你改成英文版了:)

标签: c# performance select datatable paging


【解决方案1】:

分页是您如何SELECT 数据的一种机制。考虑以下测试数据:

ID         Name                 Date
1          Bob                  1/1/2013
2          Bill                 1/3/2013
3          Andy                 2/1/2013
...

如果我想分页该数据,并且我不在乎它是如何排序的,我可以通过 ID 来完成,这样我就可以这样做:

var rows = table.Select().Take(10);
_id = (int)rows.Last()["ID"];

这会给我前十行(一页)。注意我还将最后一个ID 存储到一个名为_id 的假定类变量中。您如何存储或稍后恢复 ID 完全取决于您的程序。现在,如果我需要下一页,我可以这样做:

var rows = table.Select("ID > " + _id).Take(10);
_id = (int)rows.Last()["ID"];

那会给我下一页。但是如果我想按Name 对这些数据进行排序呢?这会稍微改变游戏。考虑以下代码:

var rows = table.Select("", "Name").Take(10);
_name = rows.Last()["Name"] as string;

这会给我第一页数据,按Name 排序。但请注意,我将 Name 的值存储在假定的类变量 _name 中以备后用。现在,当我想要下一页时,我需要执行以下操作:

var rows = table.Select("Name > '" + _name + "'", "Name").Take(10);
_name = rows.Last()["Name"] as string;

这会让我进入下一页,但仍由Name 订购。 在分页时,排序非常重要。

注意:代码并不像我提出的那么简单。您不能只使用Take(10),因为可能没有10 可供选择。此外,您可能无法只存储最后一个IDName,您可能每次都必须从某个地方恢复它。最后,您可能需要支持多重排序,即按多列排序,因此在提供排序时也要记住这一点。

最后说明:利用 原始 SQL 进行分页比上述代码要好得多 - 我只提供该代码是因为您问了关于DataTable 上的Select 方法。最好简单地构造正确的 SQL 语句,将其发送到服务器,然后显示结果。

【讨论】:

  • 嗯,我有很好的存储过程,它从数据库中获取数据,现在无法重写或更改它......所以可能是我使用 Skip / Take 的最佳方式。谢谢!
【解决方案2】:

使用 LINQ 可以最简单地创建简单的分页。

dataTable.AsEnumerable().Skip(100).Take(25);

【讨论】:

  • 谢谢。但它会比将其转换为 LINQ 更有效吗[使用几乎“原始”的 SQL]?
  • 为什么你会因为好奇而跳过 100?
  • @LukeHennerley 页数,共 25 行。要获得第 5 页:跳过 4 页(4 * 25)然后阅读页面(取 25 个项目)。
  • LINQ 很快,我认为您不会看到任何性能问题。如果您确实看到了性能问题,您可以使用 LINQ2SQL,它会为您执行“top”子句。 Guillaume 是正确的,示例将是 25 的第 5 页。
  • 您正在直接对数据表进行分页。如果数据集非常大怎么办?在这种情况下,服务器端的内存分页对您没有任何帮助。您需要以较小的块从源中提取数据。没有延迟加载功能的情况下,Datatable 几乎没有什么用处。
猜你喜欢
  • 2017-05-23
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多