4

我有以下内容从未实现的 Azure 表存储返回一个集合Skip。返回的行数约为 500。

ICollection<City> a = cityService.Get("0001I");

我想做的是能够根据一个参数返回以下范围:

records 1-100           passing in 0   as an argument to a LINQ expression
records 101-200         passing in 100 as an argument to a LINQ expression
records 201-300         passing in 200 as an argument to a LINQ expression
records 301-400         passing in 300 as an argument to a LINQ expression
etc

有什么方法可以添加到上面并使用链接来返回这些记录范围:

4

4 回答 4

4

正如您在问题中所述,Skip 方法未在 Windows Azure 表存储中实现。这意味着您还有 2 个选择:

选项1

从表存储中下载所有数据(通过使用 ToList,请参阅 abatishchev 的答案)并在此完整列表上执行 Skip 和 Take 方法。在您的问题中,您谈论的是 500 条记录。如果记录的数量没有增长太多,这个解决方案对你来说应该没问题,只要确保所有记录都具有相同的分区键。

如果数据增长,您仍然可以使用这种方法,但我建议您评估一个缓存解决方案来存储所有记录,而不是一遍又一遍地从表存储中加载它们(这将提高性能,但不要指望这会起作用具有非常大量的数据)。在 Windows Azure 中可以使用以下方法进行缓存:

选项 2

CloudTableQuery 类允许您查询数据,但更重要的是接收延续令牌以构建分页实现。这使您可以检测是否可以查询更多数据,Scott 博客文章中的分页示例(请参阅 nemensv 的评论)使用此功能。

有关延续令牌的更多信息,我建议您查看 Jim 的博文:Azure@home 第 7 部分:异步表存储分页。通过使用延续令牌,您只需下载当前页面的数据,这意味着即使您拥有数百万条记录,它也能正常工作。但是你必须知道使用延续标记的缺点:

  • 这不适用于开箱即用的 Skip 方法,因此它可能不是您的解决方案。
  • 没有页码,因为您只知道是否有更多数据(而不是多少)
  • 无法计算所有记录
于 2012-06-25T10:57:28.147 回答
0

如果底层引擎不支持分页,实现它的唯一方法是将所有数据加载到内存中,然后执行分页:

var list = cityService.Get("0001I").ToList(); // meterialize
var result = list.Skip(x).Take(y);
于 2012-06-25T07:33:53.210 回答
-1

尝试这样的事情:

cityService.Get("0001I").ToList().Skip(n).Take(100);

这应该返回记录 201-300:

cityService.Get("0001I").ToList().Skip(200).Take(100);
于 2012-06-25T07:34:33.707 回答
-1
a.AsEnumerable().Skip(m).Take(n)
于 2012-06-25T07:57:28.817 回答