我可以使用DataTable.Select()方法进行简单的分页吗?

时间:2013-03-18 12:52:09

标签: c# performance select datatable paging

我很快查看了这篇MSDN文章using datacolumn.expression,但一无所获。看起来'select expression'语法不支持分页...

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

分页是您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 进行分页比上述代码好得多 - 我只提供了代码,因为你问过关于Select上的DataTable方法。简单地构造正确的SQL语句,将其发送到服务器,然后只显示结果会好得多。