如何在Windows Azure存储上查询Cloud Blob

Gor*_*ski 26 .net linq lazy-loading azure-storage-blobs azure-sdk-.net

我使用Microsoft.WindowsAzure.StorageClient来操作Azure存储上的blob.我已经到了用户需要列出上传文件并修改/删除它们的地步.由于一个容器中有许多文件,因此查询azure存储服务以仅返回所需文件的最佳方法是什么.此外,我希望能够只返回特定数量的blob,以便我可以实现分页.

CloudBlobContainer中有一个名为ListBlobs的方法,但它似乎正在返回容器中的所有blob.这对我不起作用.

我在这个主题上搜索了很多,找不到任何有用的东西.此链接仅显示基础知识.

---------编辑

我在下面的回答并不是懒惰地检索blob,而是检索容器中的所有blob,然后过滤结果.目前还没有解决方案懒惰地检索blob.

Gor*_*ski 33

该方法ListBlobs检索该容器中的斑点懒惰地.因此,您可以针对该方法编写查询,直到您循环(或使用ToList或其他方法实现对象)列表时才执行该查询.

只有少数例子,事情会更加清晰.对于那些不知道如何获取Azure存储帐户中容器的引用的人,我建议使用本教程.

按上次修改日期排序并获取第2页(每页10个blob):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .OrderByDescending(b=>b.Properties.LastModified).Skip(10).Take(10);
Run Code Online (Sandbox Code Playgroud)

获取特定类型的文件.如果您在上传时设置了ContentType(我强烈建议您这样做),这将有效:

blobContainer.ListBlobs().OfType<CloudBlob>()
         .Where(b=>b.Properties.ContentType.StartsWith("image"));
Run Code Online (Sandbox Code Playgroud)

假设您使用扩展名设置文件名,获取.jpg文件并按文件大小排序:

blobContainer.ListBlobs().OfType<CloudBlob>()
    .Where(b=>b.Name.EndsWith(".jpg")).OrderByDescending(b=>b.Properties.Length);
Run Code Online (Sandbox Code Playgroud)

最后,在您告诉它之前,查询将不会被执行:

var blobs = blobContainer.ListBlobs().OfType<CloudBlob>()
                          .Where(b=>b.Properties.ContentType.StartsWith("image"));

foreach(var b in blobs) //This line will call the service, 
                        //execute the query against it and 
                        //return the desired files
{
   // do something with each file. Variable b is of type CloudBlob
}
Run Code Online (Sandbox Code Playgroud)

  • Hello Gorgi,blobContainer.ListBlobs()按照约定在.NET中返回IEnumerable而不是IQueryable IEnumerable用于首先将所有数据从服务器加载到内存,然后与IQueryable相反查询,IQueryable将查询解析到服务器,在惰性模式下仅返回有效的reulsts.http://www.codeproject.com/Tips/468215/Difference-Between-IEnumerable-and-IQueryable (5认同)
  • 霍莉s***,你是对的.在ListBlobs()的文档中,它说它会懒惰地检索blob,但看起来你不能在属性上写查询:\唯一可以查询的是blob的名称前缀 - 例如ListBlobs ("test") - 这只返回一个文件. (3认同)

Nat*_*nSr 19

我对Windows Azure blob存储的认识是它很简单.就像极其简陋的骨头一样.您应该仅使用它来存储文档和关联的元数据,然后按ID检索单个blob.

我最近将一个应用程序从MongoDB迁移到Windows Azure blob存储.来自MongoDB,我期待一系列不同的有效方法来检索文档.迁移之后,我现在依靠传统的RDBMS和ElasticSearch以更可搜索的方式存储blob信息.

Windows Azure blob存储如此受限制真的太糟糕了.我希望将来能够看到更多增强的搜索功能(例如,通过元数据,属性,blob名称正则表达式等进行搜索)此外,基于map/reduce的索引将非常棒.如果他们做了这些事情,微软有机会将很多人从其他文档存储系统转换过来.