我有以下内容从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
有什么方法可以添加到上面并使用链接来获取这些范围 记录返回:
答案 0 :(得分:4)
正如您在问题中所述,在Windows Azure表存储中未实现Skip方法。这意味着您还剩2个选项:
选项1
从表存储中下载所有数据(使用ToList,请参阅abatishchev的答案)并在此完整列表上执行Skip and Take方法。在您的问题中,您正在谈论500条记录。如果记录数量没有增长太多,这个解决方案应该没问题,只需确保所有记录都有相同的分区密钥。
如果数据增长你仍然可以使用这种方法,但我建议你评估一个缓存解决方案来存储所有记录,而不是一遍又一遍地从表存储中加载它们(这将提高性能,但不要指望这适用于非常大量的数据)。使用以下命令在Windows Azure中进行缓存:
选项2
CloudTableQuery类允许您查询数据,但更重要的是接收延续令牌以构建分页实现。这允许您检测是否可以查询更多数据,Scott的博客上的分页示例(请参阅nemensv的评论)使用此。
有关延续令牌的更多信息,我建议你看一下Jim的博文:Azure@home Part 7: Asynchronous Table Storage Pagination。通过使用延续令牌,您只需下载当前页面的数据,这意味着即使您有数百万条记录,它也能正常工作。但是你必须知道使用延续令牌的缺点:
答案 1 :(得分:0)
如果底层引擎不支持分页,实现它的唯一方法是将所有数据加载到内存中然后执行分页:
var list = cityService.Get("0001I").ToList(); // meterialize
var result = list.Skip(x).Take(y);
答案 2 :(得分:-1)
尝试这样的事情:
cityService.Get("0001I").ToList().Skip(n).Take(100);
这应该返回记录201-300:
cityService.Get("0001I").ToList().Skip(200).Take(100);
答案 3 :(得分:-1)
a.AsEnumerable().Skip(m).Take(n)