在.FromCache()
结果集上使用IQueryable
时,是否应该另外调用.ToList()
,还是可以使用FromCache返回具体化查询返回的IEnumerable<>
?< / p>
答案 0 :(得分:2)
我假设您正在使用http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/代码的衍生物。如果您查看FromCache
实施,您会看到query.ToList()
已被调用。这意味着评估列表是缓存的。所以,
您无需致电ToList()
答案 1 :(得分:1)
这完全取决于你想用它做什么。如果您只是foreach
过一次,那么您可以将其保留为IEnumerable
。没有必要建立一个列表只是为了立即丢弃它。
如果您计划多次迭代它,最好ToList
它,这样您就不会多次访问基础IQueryable
。如果基础查询可能会随着时间的推移而发生变化,并且您不希望这些更改反映在您的查询中,那么您还应该ToList
。
如果您可能不需要迭代所有项目(最终可能会在第一项之后,或中途停止,或类似之类),那么最好将其保留为IEnumerable
甚至可以避免在第一时间获取一些数据。
如果方法不知道它将如何使用,并且它只是一个将由尚未编写的代码使用的辅助方法,那么请考虑返回IEnumerable
。如果呼叫者有令人信服的理由将其变为列表,则可以呼叫ToList
。
对我来说,作为一般规则,我会留下IEnumerable
这样的问题,除非我有一些令人信服的理由将其设为List
。