如何使用WCF和SQL Server实现行分页?

时间:2015-12-15 17:08:59

标签: c# sql-server linq wcf

首先,我是WCF和SQL Server的新手。我正在开发一个与WCF和SQL Server 2012连接的应用程序。我有一个包含百万条记录的行的表,并且该计数将继续增加。当客户端发送请求时,我将获取30行,然后在用户请求时显示接下来的30行,依此类推。我的要求是在WCF或SQL中进行分页。我有以下问题:

  1. 我想知道在WCF或SQL Server中应该在哪里实现分页概念?哪种方法最快?
  2. 如果我在WCF中实现它,我将使用LINQ的SkipTake运算符来获取所请求的页面。这是正确的方法吗?
  3. 如果我使用SQL,哪种方法会获取最快的结果OFFSET(或)ROW_NUMBER() OVER选项?
  4. 由于我是新手,这些方法就是我所知道的。还有其他方法我不知道吗?

1 个答案:

答案 0 :(得分:1)

  1. 您希望在SQL Server上进行分页,如果您不是每个查询都返回一百万行,则必须将其加载到内存中,然后立即丢弃其中的30个。非常低效。
  2. 这取决于你的意思。如果您正在使用Skip之类的实体框架,而Take将不会在内存中执行这些操作,它会将它们转换为sql查询并在sql中运行它们。
  3. 如果您可以使用OFFSET,则会比ROW_NUMBER() OVER提供更好的效果。
  4. 有一点需要注意,如果您正在进行分页,则必须确保您的排序是确定性的。订购时可能没有联系,如果你允许关系,你可以在你的分页符上有一个权利。让我们说A行和B行是"捆绑"按您的订单:

    • 您对第1页运行查询,而行A被视为在行B和行A显示为页面上的最后一项之前
    • 您运行第2页的查询,行B被视为在第A页和第A行显示为第2页的第一项之前。

    您从未在上面的示例中显示过行B.解决此问题的最简单方法是始终确保您通过主键(或任何其他可以执行唯一索引的列集)执行订单作为您订购的最后一件事,这可确保您永远不会有任何关系