Question

Quelqu'un sait la bonne façon d'interroger d'azur stockage de table pour une valeur nulle. D'après ce que j'ai lu, il est possible (bien qu'il y ait un bug qui empêche le stockage de développement). Cependant, je continue à obtenir l'erreur suivante quand je le fais sur le stockage en nuage en direct:

  

L'une des entrées de demande est valide.

Ceci est une abêtis version de la requête LINQ que j'ai mis ensemble.

var query = from fooBar in fooBarSVC.CreateQuery<FooBar>("FooBars")
        where fooBar.PartitionKey == kPartitionID
            && fooBar.Code == kfooBarCode
            && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
            && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime() || fooBar.Termination_Date == null)
        select fooBar;

Si je lance la requête sans vérifier nulle, il fonctionne très bien. Je sais une solution possible serait d'exécuter une deuxième requête sur la collecte que cette requête ramène. Je ne me dérange pas le faire si je dois, mais je voudrais savoir si je peux obtenir cette approche de travail d'abord.

Quelqu'un voit quelque chose d'évident que je fais mal?

Était-ce utile?

La solution

Le problème est que parce que d'azur stockage de table n'a pas de schéma, la colonne null n'existe pas en réalité. Ceci est la raison pour laquelle votre requête est pas valide. il n'y a pas une telle chose comme une colonne null dans le stockage de table. Vous pourriez faire quelque chose comme magasin une chaîne vide si vous avez vraiment. Vraiment si le stockage est ici question fondamentale que la table Azure est vraiment pas construit pour être interrogé par des colonnes autres que la clé de la partition et la clé de la ligne. Chaque fois que vous faites une requête sur une de ces colonnes non standard que vous faites une analyse de table. Si vous commencez à obtenir un bon nombre de données que vous allez avoir un taux très élevé de sorties de temps de requête. Je suggère la mise en place d'un index manuel pour ces types de requêtes. Par exemple, vous pouvez stocker les mêmes données dans la même table mais avec des valeurs différentes pour la clé de ligne. En fin de compte, si vous êtes l'application ne reçoit pas l'usage fou élevé je voudrais simplement utiliser SQL Azure comme il sera beaucoup plus flexible pour les types de requêtes que vous faites.

Mise à jour: Azure a un excellent guide sur la conception de stockage de table que je recommande la lecture. http://azure.microsoft.com/en- nous / documentation / articles / stockage table design / guide

Autres conseils

Je viens d'avoir ce problème et a trouvé un joli petit ninja-truc pour vraiment test pour les valeurs NULL. Bien que j'utilise l'interface Azure Storage directement, je suis 90% sûr qu'il fonctionnera pour LINQ aussi si vous faites la même chose.

Voici ce que je l'ai fait pour vérifier si le prix (Int32?) Est nulle:

not (Price lt 0 or Price gt 0)

Je suppose que dans votre cas, vous pouvez faire la même chose dans LINQ en testant si fooBar.Termination_Date est inférieure ou supérieure à DateTime.UtcNow par exemple. Quelque chose comme ceci:

where fooBar.PartitionKey == kPartitionID
  && fooBar.Code == kfooBarCode
  && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
  && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime()
  || (not (fooBar.Termination_Date < DateTime.UtcNow 
            or fooBar.Termination_Date > DateTime.UtcNow))
select fooBar;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top