編集:この質問は、Martin IngvarKofoedJensenによるブログ投稿を参照しているようです。この質問とその質問の違いは、への呼び出し.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.
....
}
実際に書かれている質問について:両方のコードスニペットで1つのトランザクション(最大5,000 BLOB)が発生します。LinqPad / Fiddlerで両方のコードスニペットをテストしましたが、blobのリストを生成するためのAPI呼び出しが1つしか表示されません(ストレージ名を{mystore}に置き換えました)。
https://{mystore}.blob.core.windows.net/
{mystore}?restype=container&comp=list&delimiter=%2F&timeout=90
List Blobs REST APIのドキュメントによると、1回の呼び出しで最大5,000件の結果を返すことができます。したがって、コンテナ全体のすべてのBLOBを一覧表示する場合は、最大(#BLOB / 5000)のトランザクションが必要になります。