在Azure存储中以相对简单的方式实现简单分页:Paging with Windows Azure Table Storage。这可以使用延续令牌功能来实现。
但是
这只是严重分页的开始。第一个问题是排序。您无法在Azure表中执行OrderBy。什么是解决这个问题的最佳解决方案?必须对页面进行排序,这就是事实。
第二个问题,当进入分页时,要知道总页数的数量,只有连续令牌功能,这是不可能的。在每个页面上执行“.Count()”在我看来效率非常低(例如,因为分区可以在多个服务器上)。
第三个问题是,与第二个问题相关,即使你可以计算你有多少页,如何将计数页面“连接”到实际的连续标记?这对我来说是最大的谜。 如何从特定的表格行继续?
如果可以提供正确的解决方案,我会非常高兴。我必须承认我也有一个,我会在下面的答案之一中写下来。
答案 0 :(得分:10)
我知道这并没有按照你要求的方式解决你的问题,但我仍然不相信应该以你建议的方式进行分页。我的意思是,由于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;
所以博客b1日期为10/1/2008 10:00:00 AM将有2521794455999999999作为RowKey,而b2日期为2008年2月10日10:00:00将有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;
(这取自Windows Azure Table,2008年12月由Microsoft提交的文档provided)
至于计算页数,这很简单,一个简单的除法操作就可以解决这个问题;至于延续令牌,一种方法是(在初始请求时)在每个页面上“走”并得到延续令牌,它基本上只是告诉你哪一行和一行。分区键接下来。但拥有所有这些意味着您容易受到一致性错误的影响(例如,如果有人将某些内容发布到同一个表存储中)。
就个人而言,我会基于rowkeys进行分页,如上所述,或者,如果需要,请转移到支持它的存储引擎。
进一步详细说明,如果你知道你只有一个“OrderBy”子句,你可以选择所有这些子句,并通过一些暗示,猜猜页面边界是什么。
另一方面,我认为所提供的分页不允许在前端进行分页,而是要分配1000个结果限制。但这只是我的0.02美元。