编辑:看来这个问题是参考Martin Ingvar Kofoed Jensen 的博客文章。这个问题和那个问题之间的区别在于调用.Where(...).SingleOrDefault()
. 因为 LINQ 是惰性求值的,所以在Container.ListBlobs()
它的阶段仍然是一个IEnumerable
并且尚未调用 REST API(没有检索到数据)。一旦发生结果操作(例如ToList()
或SingleOrDefault()
),就会下载数据。由于在以下代码中对循环内的惰性列表调用了非惰性操作,因此每次循环迭代都会产生一个事务:
foreach (string filePath in allFilesInStartFolder)
{
string fileHash = GetFileHashFromCache(filePath, lastSync);
/* Checking for added files */
var blob = blobs.Where(b => b.LocalPath == filePath).SingleOrDefault();
// ^^ This is a non-lazy op on a lazy evalution, so it causes a REST call.
....
}
关于实际编写的问题:两个代码片段都将产生一个事务(最多 5,000 个 blob)。我在LinqPad / Fiddler中测试了这两个代码片段,我只看到一个API 调用来生成 blob 列表(用 {mystore} 替换了我们的存储名称):
https://{mystore}.blob.core.windows.net/
{mystore}?restype=container&comp=list&delimiter=%2F&timeout=90
根据List Blobs REST API的文档,一次调用最多可以返回 5,000 个结果。因此,如果要列出整个容器中的所有 blob,最多需要 (# blobs / 5000) 个事务。