我可以使用LINQ跳过一个集合,只返回100条记录吗?

时间:2012-06-25 07:24:13

标签: c# .net linq azure

我有以下内容从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 个答案:

答案 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。通过使用延续令牌,您只需下载当前页面的数据,这意味着即使您有数百万条记录,它也能正常工作。但是你必须知道使用延续令牌的缺点:

  • 这不适用于开箱即用的Skip方法,因此它可能不适合您。
  • 没有页面'数字',因为您只知道是否有更多数据(不是多少)
  • 无法计算所有记录

答案 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)