CloudBlobContainer.ListBlobs() - 使用 ToList() 降低交易成本

Yar*_*evi 4 c# azure azure-storage azure-storage-blobs

我有两个代码示例:

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs();
foreach (var blob in blobs)
{
    //Do somthing
}
Run Code Online (Sandbox Code Playgroud)

和这个 :

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs().ToList();
foreach (var blob in blobs)
{
     //Do somthing
}
Run Code Online (Sandbox Code Playgroud)

第二个例子会在“交易方面”提供任何优势吗?
在每个示例中,对 blob 存储进行了多少事务?

mel*_*okb 5

编辑:看来这个问题是参考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.
    ....
}
Run Code Online (Sandbox Code Playgroud)

关于实际编写的问题:两个代码片段都将导致单个事务(最多 5,000 个 blob)。我在LinqPad / Fiddler 中测试了两个代码片段,我只看到一个API 调用来生成 blob 列表(用 {mystore} 替换了我们的存储名称):

https://{mystore}.blob.core.windows.net/
    {mystore}?restype=container&comp=list&delimiter=%2F&timeout=90
Run Code Online (Sandbox Code Playgroud)

根据List Blobs REST API的文档,一次调用最多可以返回 5,000 个结果。因此,如果要列出整个容器中的所有 blob,最多需要 (# blob / 5000) 个事务。