【发布时间】:2009-01-19 22:33:39
【问题描述】:
在我见过的所有数据分页器示例中(使用绑定到 ListView 的 LinqDataSource),对数据库的查询会返回完整的记录集。我怎样才能获得我想要显示的行的页面?
例如,如果我有一个包含 100 万行的表,并且我想在第 5 页上查看 10 个结果,我会得到第 51 到 60 行。
我确定我必须实现自定义分页,但我没有找到任何好的示例。
【问题讨论】:
在我见过的所有数据分页器示例中(使用绑定到 ListView 的 LinqDataSource),对数据库的查询会返回完整的记录集。我怎样才能获得我想要显示的行的页面?
例如,如果我有一个包含 100 万行的表,并且我想在第 5 页上查看 10 个结果,我会得到第 51 到 60 行。
我确定我必须实现自定义分页,但我没有找到任何好的示例。
【问题讨论】:
有很多方法可以做到这一点,但是,我个人喜欢一个基于 SQL 的解决方案,它可以访问数据库并获取结果集。这个4GuysFromRolla Article 很好地解释了它。
【讨论】:
如果您使用的是 MSSql2005,请查看此article。
如您所见,诀窍是使用函数 ROW_NUMBER(),它允许您获取记录集中行的序号。有了它,您可以简单地根据您希望在页面中获取的行数启用分页。
【讨论】:
我的印象(来自 Scott Guthie 的博文“LINQ to SQL (Part 9)”)是 LinqDataSource 在数据库级别为您处理分页:
上面要注意的一个非常酷的事情是分页和排序仍然可以与我们的 GridView 一起使用 - 即使我们使用自定义 Selecting 事件来检索数据。 这种分页和排序逻辑发生在数据库中 - 这意味着我们只需要从数据库中拉回 10 个产品,这些产品需要在 GridView 中显示当前页面索引(使其非常高效)。
(原重点)
如果您使用一些自定义分页,您可以在 LINQ to SQL 中执行类似的操作:
var tagIds = (from t in Tags where tagList.Contains(t.TagText) select t.TagID).Skip(10).Take(10).ToList();
这是告诉 LINQ 在跳过前 10 行之后占用 10 行(相当于 T-SQL“TOP 10”) - 显然这些值可以是动态的,基于页面大小和页码,但你得到想法。
引用的帖子还谈到了使用带有 LinqDataSource 的自定义表达式。
Scott 在Part 3 中也有更多关于 Skip/Take 的信息。
【讨论】: