我有以下内容从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
有什么方法可以添加到上面并使用链接来获取这些范围
记录返回:
最佳答案 正如您在问题中所述,在Windows Azure表存储中未实现Skip方法.这意味着您还剩2个选项:
选项1
从表存储中下载所有数据(通过使用ToList,请参阅abatishchev的答案)并在此完整列表上执行Skip and Take方法.在您的问题中,您正在谈论500条记录.如果记录数量没有增长太多,这个解决方案对你来说应该没问题,只需要确保所有记录都有相同的分区键.
如果数据增长,你仍然可以使用这种方法,但我建议你评估一个缓存解决方案来存储所有记录,而不是一遍又一遍地从表存储中加载它们(这将提高性能,但不要指望它能够工作有非常大量的数据).使用以下命令在Windows Azure中进行缓存:
> Windows Azure Caching (Preview)
> Windows Azure Shared Caching
选项2
CloudTableQuery类允许您查询数据,但更重要的是接收延续令牌以构建分页实现.这允许您检测是否可以查询更多数据,Scott的博客上的分页示例(请参阅nemensv的评论)使用此.
有关延续令牌的更多信息,我建议您查看Jim的博客文章:Azure@home Part 7: Asynchronous Table Storage Pagination.通过使用延续令牌,您只下载当前页面的数据,这意味着即使您有数百万条记录,它也能正常工作.但是你必须知道使用延续令牌的缺点:
>这不适用于开箱即用的Skip方法,因此它可能不适合您.
>没有页面’数字’,因为你只知道是否有更多的数据(不是多少)
>无法计算所有记录