Azure存储表分页

Pet*_*nar 16 c# architecture azure azure-storage azure-table-storage

要在Azure存储中实现相对简单的简单分页:使用Windows Azure表存储进行分页.这可以使用延续令牌功能来实现.

但.

这只是严重分页的开始.第一个问题是排序.您无法在Azure表中执行OrderBy.什么是解决这个问题的最佳解决方案?必须对页面进行排序,这就是事实.

第二个问题,当来到分页时,要知道总页数,只有连续令牌功能这是不可能的.要在每个页面上执行".Count()"在我看来效率非常低(例如,因为分区可能位于多个服务器上).

第三个问题是,与第二个问题相关,即使你可以计算你有多少页,如何将计数页面"连接"到实际的连续标记?这对我来说是最大的谜.如何从特定的表行继续?

如果可以提供正确的解决方案,我会非常高兴.我必须承认我也有一个,我会在下面的答案之一中写下来.

Anž*_*nik 11

我知道这并没有按照你要求的方式解决你的问题,但我仍然不相信应该按你建议的方式进行分页.我的意思是,由于Azure Table Storage不支持您所需的功能,因此可能不太合适.

我会在本地缓存中获取数据,在那里执行顺序和分页并完成它.通过仔细构建rowkey/partitionkey,有一个建议的解决方法,但我强烈建议你不要这样做.

Blog blog=  new Blog();
// Note the fixed length of 19 being used since the max tick value is 19 digits long.
string rowKeyToUse = string.Format("{0:D19}", 
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
blog.RowKey = rowKeyToUse;
Run Code Online (Sandbox Code Playgroud)

因此,博客b1日期为10/1/2008 10:00:00 AM将具有2521794455999999999作为RowKey,并且b2日期为10/2/2008 10:00:00 AM将具有2521793591999999999作为RowKey,因此b2将在b1之前.

要检索日期为10/1/2008 10:00:00之后的所有博客,我们将使用以下查询:

     string rowKeyToUse = string.Format("{0:D19}", 
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var blogs = 
    from blog in context.CreateQuery<Blog>("Blogs")
    where blog.PartitionKey == "Football" 
        && blog.RowKey.CompareTo(rowKeyToUse) > 0
  select blog;
Run Code Online (Sandbox Code Playgroud)

(这取自Windows Azure Table,2008年12月由Microsoft 提供的文档)

至于计算页数,这很简单,一个简单的除法操作就可以了.至于延续令牌,一种方法是(在初始请求时)在每个页面上"走"并获得延续令牌,它基本上只是告诉你下一行和分区键.但拥有所有这些意味着您容易受到一致性错误的影响(例如,如果有人将某些内容发布到同一个表存储中).

就个人而言,我会基于rowkeys进行分页,如上所述,或者,如果这是一个要求,请转移到支持它的存储引擎.

为了进一步说明,如果你知道你只有一个"OrderBy"子句,你可以选择所有这些子句,并通过一些暗示来猜测页面边界是什么.

在旁注中,我认为所提供的分页不允许在前端进行分页,而是分配1000个结果限制.但这只是我0.02美元.