2017-08-06 2 views
0

J'essaie de trouver spécifique Uri.AbsolutePath pour le Blob Block par son nom. Le conteneur Azure Storage contient uniquement des blobs de bloc. La liste des blobs retournés du stockage est IEnumerable(Of IListBlobItem).Requête LINQ via blobs Azure de IEnumerable (Of IListBlobItem)

J'utilise FirstOrDefault pour trouver un blob spécifique par son nom. Le compilateur dit qu'il n'y a pas de propriété Name pour CloudBlockBlob. Ceci est probablement lié au type d'élément blob unique. Même si j'utilise CloudBlockBlob dans FirstOrDefault, c'est toujours IListBlobItem, donc la propriété Name est manquante. Comment aborder cela de manière efficace?

Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse("Storage connection string") 
Dim blobClient As CloudBlobClient = storageAccount.CreateCloudBlobClient() 
Dim BlobList As IEnumerable(Of IListBlobItem) = blobClient.GetContainerReference("ContainerName").ListBlobs 
Path= If(BlobList.FirstOrDefault(Function(CloudBlockBlob) CloudBlockBlob.Name = "ABC.pdf")?.Uri.AbsolutePath, "") 

Répondre

1

Bien sûr, FirstOrDefault se traduira par une IListBlobItem selon IntelliSense, mais il a bien sûr une mise en œuvre effective. Tout débogueur vous dira quel type réel est retourné.

Dans votre cas, vous êtes seulement intéressé par les résultats de ListBlobs qui sont réels du type CloudBlockBlob. Pour ce faire, vous pouvez utiliser la méthode OfType:

Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse("Storage connection string") 
Dim blobClient As CloudBlobClient = storageAccount.CreateCloudBlobClient() 
Dim BlobList As IEnumerable(Of CloudBlockBlob) = blobClient.GetContainerReference("ContainerName").ListBlobs.OfType(Of CloudBlockBlob) 
Path = If(BlobList.FirstOrDefault(Function(CloudBlockBlob) CloudBlockBlob.Name = "ABC.pdf")?.Uri.AbsolutePath, "") 

Vous pouvez probablement améliorer vous effectuez une recherche par des éléments de filtrage sur le côté serveur en utilisant l'option prefix de ListBlobs

Dim BlobList As IEnumerable(Of CloudBlockBlob) = blobClient.GetContainerReference("ContainerName").ListBlobs(prefix := "ABC.pdf").OfType(Of CloudBlockBlob) 

Cette ligne ne fera que la liste blobs dont le nom commence par/est égal à "ABC.pdf". Clause de non-responsabilité: Je ne suis pas un développeur VB.Net donc il y a peut-être quelques petites erreurs et une certaine marge d'amélioration de la lisibilité.