繁体   English   中英

我可以使用LINQ跳过集合并仅返回100条记录吗?

[英]Can I use LINQ to skip a collection and just return 100 records?

我有以下代码从未实现“ Skip Azure表存储返回一个集合。 返回的行数约为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 Table存储中未实现“跳过”方法。 这意味着您还有两个选择:

选项1

从表存储中下载所有数据(通过使用ToList,请参阅abatishchev的答案),并在此完整列表上执行Skip and Take方法。 在您的问题中,您正在谈论500条记录。 如果记录数量没有增加太多,那么该解决方案应该适合您,只需确保所有记录具有相同的分区键即可。

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

选项2

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

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

  • 这对于开箱即用的跳过方法不起作用,因此它可能不是您的解决方案。
  • 没有页面“数字”,因为您只知道是否有更多数据(而不是多少)
  • 无法计数所有记录

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

var list = cityService.Get("0001I").ToList(); // meterialize
var result = list.Skip(x).Take(y);

尝试这样的事情:

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

这应该返回记录201-300:

cityService.Get("0001I").ToList().Skip(200).Take(100);
a.AsEnumerable().Skip(m).Take(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM