2017-09-28 8 views
1

特定のデータに一致するメタデータを含むブロブストレージ内のアイテムのみを戻す方法を見つけることを試みています。すべてのフィールドには「FlightNo」というキーがあります。ブロブ内のメタデータの検索

私が本当に欲しいのは、メタデータと一致するすべてのファイル(listBlob)を見つけ出し、1つのレベルを上げてから、そのデータセットを反復処理し、各ファイルが5つのアイテムメタデータの

これまでの私の非常に非友好的なコードです。

foreach (IListBlobItem item in container.ListBlobs(null, false)) 
     { 
      if (item.GetType() == typeof(CloudBlockBlob)) 
      { 

       CloudBlockBlob blob = (CloudBlockBlob)item; 

       blob.FetchAttributes(); 

       foreach (var metaDataItem in blob.Metadata) 
       { 
        dictionary.Add(metaDataItem.Key, metaDataItem.Value); 
       } 

       if (dictionary.Where(r=>r.Key == "FlightNo" && r.Value == FlightNo).Any()) 
       { 
        if (dictionary.Where(r => r.Key == "FlightDate" && r.Value == FlightDate).Any()) 
        { 
         if (dictionary.Where(r => r.Key == "FromAirport" && r.Value == FromAirport).Any()) 
         { 
          if (dictionary.Where(r => r.Key == "ToAirport" && r.Value == ToAirport).Any()) 
          { 
           if (dictionary.Where(r => r.Key == "ToAirport" && r.Value == ToAirport).Any()) 
           { 
            retList.Add(new BlobStorage() 
            { 
             Filename = blob.Name, 
             BlobType = blob.BlobType.ToString(), 
             LastModified = (DateTimeOffset)blob.Properties.LastModified, 
             ContentType = blob.Properties.ContentType, 
             Length = blob.Properties.Length, 
             uri = RemoveSecondary(blob.StorageUri.ToString()), 
             FlightNo = dictionary.Where(r => r.Key == "FlightNo").Select(r => r.Value).SingleOrDefault(), 
             Fixture = dictionary.Where(r => r.Key == "FixtureNo").Select(r => r.Value).SingleOrDefault(), 
             FlightDate = dictionary.Where(r => r.Key == "FlightDate").Select(r => r.Value).SingleOrDefault(), 
             FromAirport = dictionary.Where(r => r.Key == "FromAirport").Select(r => r.Value).SingleOrDefault(), 
             ToAirport = dictionary.Where(r => r.Key == "ToAirport").Select(r => r.Value).SingleOrDefault() 
            }); 

           } 
          } 
         } 
        } 
       } 

       dictionary.Clear(); 
      } 
     } 

ありがとうございます。 Scott

+0

あなたの質問が正確ではありません。しかし...索引付けがないので、BLOBメタデータの検索は効率的な操作ではありません。クエリを容易にするために、メタデータを保持するために、ある種のデータベースを使用することを検討することもできます。 –

答えて

1

5個のすべてを含むブロブを検索したいと正しく理解していれば、アイテムのメタデータに言及しました。これを行うには、次のコードを使用することができます。私は私の側でそれをテストし、正しく動作します。

var connectionString = "storage connection string"; 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("container"); 
var blobs = container.ListBlobs(); 
var blobList = new List<CloudBlockBlob>(); 
foreach (var item in blobs) 
{ 
     CloudBlockBlob blob = (CloudBlockBlob)item; 

     blob.FetchAttributes(); 
     if (blob.Metadata.Contains(new KeyValuePair<string, string>("FlightNo", "FlightNoValue")) && 
     blob.Metadata.Contains(new KeyValuePair<string, string>("FlightDate", "FlightDateValue")) && 
     blob.Metadata.Contains(new KeyValuePair<string, string>("FromAirport", "FromAirportValue")) && 
     blob.Metadata.Contains(new KeyValuePair<string, string>("ToAirport", "ToAirportValue")) && 
     blob.Metadata.Contains(new KeyValuePair<string, string>("FixtureNo", "FixtureNoValue"))) 
     { 
      blobList.Add(blob); 
     } 
+0

ありがとうございます。テストしてあなたに戻ってきます。遅れて申し訳ありません。 apprec.Scot – scottsanpedro

+0

メタデータの値を確認する必要がない場合は、[blob.Metadata.ContainsKey( "KeyName")]を使用できます(https://msdn.microsoft.com/en-us//library/ kw5aaea4(v = vs.110).aspx) –

+0

は完璧に動作します。遅れて申し訳ありません。多くの感謝のスコット – scottsanpedro

関連する問題