Frage

Wer weiß, die richtige Art und Weise Azure Tabellen Speicher für einen Nullwert abzufragen. Von dem, was ich gelesen habe, ist es möglich (obwohl es ein Fehler ist, die es auf der Entwicklung Lagerung verhindert). Allerdings habe ich immer die folgende Fehlermeldung erhalten, wenn ich so auf dem Live-Cloud-Speicher:

  

Einer der Anforderungseingänge ist nicht gültig.

Dies ist eine verdummte Version der LINQ-Abfrage, dass ich zusammen haben.

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;

Wenn ich die Abfrage ohne Prüfung auf null laufen, es funktioniert gut. Ich weiß, dass eine mögliche Lösung eine zweite Abfrage auf der Sammlung zu laufen wäre, dass diese Abfrage zurückbringt. Ich habe nichts dagegen tun, dass, wenn ich muß, würde aber gerne wissen, ob ich zum ersten Mal diesen Ansatz Arbeit bekommen kann.

Wer etwas sehen offensichtlich ich falsch?

War es hilfreich?

Lösung

Das Problem ist, dass, weil zu kein Schema hat, der null Spalt existieren eigentlich nicht. Aus diesem Grund Ihrer Anfrage nicht gültig ist. gibt es so etwas wie eine Null-Spalte in der Tabelle Speicher nein. Man könnte so etwas wie Speicher eine leere Zeichenfolge tun, wenn Sie wirklich zu haben. Wirklich obwohl die grundlegende Frage ist hier, dass Azure-Tabellen-Speicher wirklich nicht von irgendwelchen Spalten andere als Partitionsschlüssel und Zeilenschlüssel abgefragt werden soll, gebaut. Jedes Mal, wenn Sie eine Abfrage auf einem dieser Nicht-Standard-Spalten machen Sie ein Table-Scan tun. Wenn Sie beginnen, eine Menge Daten bekommen Sie eine sehr hohe Rate der Abfrage Auszeiten haben werden. Ich würde vorschlagen, eine manuelle Index für diese Art von Anfragen einrichten. Zum Beispiel könnten Sie die gleichen Daten in der gleichen Tabelle speichern, aber mit unterschiedlichen Werten für die Row-Taste. Letztendlich, wenn Sie App ist nicht verrückt hohe Nutzung bekommen würde ich nur SQL Azure verwenden, da es viel flexibler für die Art von Anfragen, die Sie tun.

Update: Azure hat einen großen Führer auf dem Tisch Storage-Design, dass ich empfehlen Lesung würde. http://azure.microsoft.com/en- wir / Dokumentation / articles / storage-Tisch-Design-Guide /

Andere Tipps

Ich hatte gerade dieses Problem und fand einen netten kleinen Ninja-Trick für NULL-Werte tatsächlich zu testen. Obwohl ich die Azure Storage-Schnittstelle direkt bin mit, ich bin 90% sicher, dass es für LINQ funktionieren auch, wenn Sie das gleiche tun.

Hier ist, was ich tat, zu überprüfen, ob Preis (Int32?) Null ist:

not (Price lt 0 or Price gt 0)

Ich vermute, in Ihrem Fall, dass Sie das gleiche in LINQ tun können durch Testen, ob fooBar.Termination_Date kleine oder größer ist als DateTime.UtcNow zum Beispiel. So etwas wie folgt aus:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top