Редактировать : Похоже, этот вопрос относится к сообщению в блоге Мартина Ингвара Кофоеда Дженсена . Разница между этим вопросом и этим вопросом заключается в вызове .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.
....
}
Относительно вопроса в том виде, в котором он написан: оба фрагмента кода будут содержать одну транзакцию (до 5000 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 , до 5000 результатов может быть возвращено за один вызов. Поэтому, если вы хотите перечислить все BLOB-объекты во всем контейнере, потребуется максимум (# blobs / 5000) транзакций.