gpt4 book ai didi

c# - Azure 存储表分页

转载 作者:可可西里 更新时间:2023-11-01 03:10:28 25 4
gpt4 key购买 nike

以相对简单的方式在 Azure 存储中实现简单分页:Paging with Windows Azure Table Storage 。这可以通过延续 token 功能来实现。

但是。

这只是认真寻呼的开始。第一个问题是排序。您不能在 Azure 表中执行 OrderBy 操作。克服这个问题的最佳解决方案是什么?页面必须排序,这是事实。

第二个问题,当涉及分页时,要知道总页数,仅使用连续 token 功能这是不可能的。在我看来,在每个页面上执行“.Count()”效率非常低(例如,因为分区可能位于多个服务器上)。

第三个问题是,与第二个问题相关,即使你可以计算你有多少页面,如何将计算的页面“连接”到实际的延续 token ?这对我来说是最大的谜团。 如何从特定表格行获取延续?

如果能够提供正确的解决方案,我将非常高兴。我必须承认我也有一个,我会将其写在下面的答案之一中。

最佳答案

我知道这并不能按照您要求的方式解决您的问题,但我仍然不认为应该按照您建议的方式执行分页。我的意思是,由于 Azure 表存储不支持您所需的功能,因此它可能不太适合。

我会在本地缓存中获取数据,在那里执行顺序和分页,然后完成它。对于此限制,有一个建议的解决方法,即仔细构建​​行键/分区键,但我强烈建议您不要遵循该方法。

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;

因此,日期为 10/1/2008 10:00:00 AM 的博客 b1 将使用 2521794455999999999 作为 RowKey,而日期为 10/2/2008 10:00:00 AM 的博客 b2 将使用 2521793591999999999 作为 RowKey,因此 b2 将在 b1 之前。

要检索 2008 年 10 月 1 日上午 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;

(此内容取自 Microsoft 于 2008 年 12 月发布的 Windows Azure 表文档 provided)

至于计算页数,这很简单,简单的除法操作就可以了;至于连续 token ,一种方法是(根据初始请求)在每个页面上“行走”并获取连续 token ,它基本上只是告诉您接下来是哪些行和分区键。但是拥有所有这些意味着您很容易出现一致性错误(例如,如果有人将某些内容发布到同一个表存储中)。

就我个人而言,我会根据行键进行分页,如上所述,或者,如果这是一个要求,则转移到支持它的存储引擎。

进一步详细说明,如果您知道只有一个“OrderBy”子句,则可以选择所有这些子句,并通过某种暗示猜测页面边界是什么。

顺便说一句,我相信提供的分页不是为了允许在前端分页,而是为了减轻 1000 个结果的限制。但这只是我的 0.02 美元。

关于c# - Azure 存储表分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6328042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com