Domanda

Qualcuno sa il modo corretto per interrogare Azure tavolo per un valore nullo. Da quello che ho letto, è possibile (anche se c'è un bug che impedisce il magazzinaggio di sviluppo). Tuttavia, continuo a ricevere il seguente errore quando lo faccio sul cloud storage in diretta:

  

Uno degli ingressi di richiesta non è valido.

Questa è una dumbed giù versione della query LINQ che ho messo insieme.

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;

Se eseguo la query senza controllare nulla, funziona benissimo. So che una possibile soluzione potrebbe essere quella di eseguire una seconda query sulla raccolta che questa query riporta. Non mi importa di fare che, se ho bisogno di, ma vorrei sapere se posso ottenere questo approccio al lavoro di prima.

Chiunque vedere nulla ovvio che sto facendo male?

È stato utile?

Soluzione

Il problema è che, poiché Azure tabella non dispone di uno schema, la colonna nullo in realtà non esiste. Questo è il motivo per cui la query non è valido. non v'è alcuna cosa come una colonna null in memorizzazione tabella. Si potrebbe fare qualcosa di simile a negozio di una stringa vuota se si hanno veramente a. In realtà, però la questione fondamentale è che lo stoccaggio tavolo Azure in realtà non è costruito per essere interrogato da tutte le colonne diverse da chiave di partizione e la chiave di fila. Ogni volta che si effettua una query su una di queste colonne non standard si sta facendo una scansione di tabella. Se si inizia a ottenere un sacco di dati che si sta per avere un tasso molto elevato di timeout di query. Vorrei suggerire la creazione di un indice di manuale per questi tipi di query. Ad esempio, è possibile memorizzare gli stessi dati nella stessa tabella, ma con valori diversi per la chiave Row. In definitiva, se siete applicazione non è sempre l'utilizzo folle alta vorrei solo utilizzare SQL Azure in quanto sarà molto più flessibile per i tipi di query che si sta facendo.

Aggiornamento: Azure ha una grande guida sul design di storage tabella che mi sento di raccomandare la lettura. http://azure.microsoft.com/en- noi / documentazione / articoli / storage-table-design-guida /

Altri suggerimenti

Ho appena avuto questo problema e trovato un bel po 'ninja-trucco per realtà di prova per i valori nulli. Anche se sto usando direttamente l'interfaccia Azure, sono il 90% sicuro che funzionerà per LINQ anche se si fa lo stesso.

Ecco quello che ho fatto per controllare se il prezzo (Int32?) È nullo:

not (Price lt 0 or Price gt 0)

Sto indovinando nel tuo caso si può fare lo stesso in LINQ testando se fooBar.Termination_Date è minore o maggiore di DateTime.UtcNow per esempio. Qualcosa di simile a questo:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top