2 votes

Azure Table Storage Projection Query et l'exception Not Implemented

J'ai une classe Personne que j'enregistre dans une table dans le stockage de table Azure.

Je veux la rechercher avec l'une des requêtes suivantes :

var query = from getThis in _serviceContext.CreateQuery(_tableName)
                        where getThis.Name.Contains(searchTerm)
                        select new Personne
                        {
                            PartitionKey = getThis.PartitionKey, 
                            RowKey = getThis.RowKey,
                            Name = getThis.Name
                        };

OU

CloudTableQuery query =
                 (from getThis in _serviceContext.CreateQuery(_tableName)
                  where getThis.Name.Contains(searchTerm)
                  select getThis).AsTableServiceQuery();

Avec l'un ou l'autre, je reçois l'erreur suivante, lancée dans la boucle foreach que j'utilise pour parcourir les résultats de la requête :

NotImplemented L'opération demandée n'est pas implémentée sur la ressource spécifiée.

J'ai pensé que cela pouvait résulter du fait que mon modèle Personne n'hérite pas de TableServiceEntity (je refuse d'introduire ce couplage - je l'ai donc décoré avec cet attribut [DataServiceKey("PartitionKey", "RowKey")] et lui ai donné manuellement une propriété PartitionKey et RowKey.

J'ai donc essayé de créer une entité qui héritait bien de TableServiceEntity, ce qui me permettrait de interroger cette table (comme vous pouvez le voir à partir des requêtes, la seule propriété qui m'intéresse est le Nom).

Cette nouvelle entité est la suivante :

class PersonForSearch : TableServiceEntity
{
    public string Name { get; set; }
}

Cependant, cela n'a pas résolu le problème. Est-ce que cette erreur parle d'une autre ressource que la classe que j'utilise dans ma requête?

5voto

Igorek Points 9115

Il y a deux problèmes ici:

1) Azure Table Storage ne prend pas en charge la méthode Contains(). C'est la raison pour laquelle vous obtenez une exception Not Implemented. ATS prend en charge string.Compare() pour toutes les opérations sur les plages de chaînes de caractères

2) Pour récupérer efficacement les données, vous ne pouvez rechercher que sur PartitionKey ou sur la combinaison PartitionKey/RowKey. Toute autre requête entraînera des erreurs ou le téléchargement complet de la table en mémoire client (je ne me souviens pas lequel). Si votre table est petite, téléchargez-la entièrement en mémoire en supprimant la clause 'où' et utilisez ensuite Linq pour les objets pour la requête comme vous le souhaitez. S'il est grand, trouvez un moyen de le comparer aux champs PartitionKey ou PartitionKey/RowKey

Si je comprends correctement ce que vous essayez de faire, c'est que vous essayez de faire une recherche de chaîne partielle dans la table des employés. Dans l'ensemble, ATS n'est pas une très bonne solution pour les recherches basées sur les chaînes de caractères (à moins qu'il ne s'agisse de recherches "commençant par" sur les champs PartitionKey ou PartitionKey/RowKey). Je recommande vivement Lucene.NET pour effectuer des recherches textuelles dans le cloud. Il existe également une API Azure Directory pour Lucene.NET disponible. Ou passez à SQL Azure

J'espère que cela aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X