[英]Can I use a collection initializer with LINQ to return a fully populated collection?
[英]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.