編輯:看來這個問題是參照blog post by 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.
....
}
關於這個問題,因爲它實際上是寫:代碼段將產生single transaction(最多5,000個斑點)。我在LinqPad/Fiddler測試兩個代碼片段,我只看到一個single API call產生斑點的列表(代替了我們的存儲名稱與{的MyStore}):
https://{mystore}.blob.core.windows.net/
{mystore}?restype=container&comp=list&delimiter=%2F&timeout=90
根據對List Blobs REST API文檔,高達5000結果可以在一次調用中返回。所以,如果你想列出所有的斑點在整個容器,將需要最多(#斑點/ 5000)的交易。
林不知道你說你的問題,你打算,閱讀我的BLOB信息的評論時,發現這裏:http://toolheaven.net/post/How-to-do-a-fast-recursive-local-文件夾tofrom-蔚的Blob存儲synchronization.aspx#評論 –
@馬丁:是的,我會說'。哪裏(...)的SingleOrDefault()'讓世界上所有的差異。 – mellamokb