Pregunta

¿alguien sabe la forma correcta de realizar consultas azul almacenamiento de tablas para un valor nulo. Por lo que he leído, es posible (aunque hay un error que impide que el almacenamiento de desarrollo). Sin embargo, me siguen dando el siguiente error cuando lo hago en el almacenamiento en la nube en directo:

  

Una de las entradas de petición no es válida.

Este es un callados versión de la consulta LINQ que he puesto juntos.

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 me quedo la consulta sin comprobar nula, funciona bien. Sé que una posible solución sería la de ejecutar una segunda consulta en la colección que esta consulta trae de vuelta. No me importa hacer eso si necesito, pero me gustaría saber si puedo conseguir este enfoque de trabajo en primer lugar.

Alguien vio nada obvio que estoy haciendo mal?

¿Fue útil?

Solución

El problema es que debido azul de almacenamiento de tabla no tiene un esquema, la columna de la nula en realidad no existe. Esta es la razón por la consulta no es válida. no hay tal cosa como una columna nula en el almacenamiento de tablas. Se podría hacer algo como tienda de una cadena vacía si realmente tiene que hacerlo. Realmente sin embargo la cuestión fundamental aquí es que Azure de almacenamiento de tabla de verdad no se construye para ser consultada por cualquier columna que no sean clave de partición y la clave de fila. Cada vez que realice una consulta en una de estas columnas no estándar que está haciendo un recorrido de tabla. Si usted comienza a obtener gran cantidad de datos que se van a tener una muy alta tasa de consulta tiempos muertos. Yo sugeriría la creación de un índice manual para este tipo de consultas. Por ejemplo, podría almacenar los mismos datos en la misma tabla, pero con diferentes valores para la clave de fila. En última instancia, si su aplicación son no está recibiendo un alto uso loca me acaba de utilizar SQL Azure, ya que será mucho más flexible para los tipos de consultas que está haciendo.

Actualización: Azure tiene una gran guía en el diseño de almacenamiento de tablas que recomendaría la lectura. http://azure.microsoft.com/en- nosotros / documentación / artículos / de almacenamiento de tabla-diseño-guía /

Otros consejos

Sólo tenía este problema y encontré un pequeño ninja truco para realmente prueba para los nulos. A pesar de que estoy usando la interfaz de Azure Storage directamente, estoy 90% seguro de que funcionará para LINQ también si usted hace lo mismo.

Esto es lo que hice para comprobar si los precios (Int32?) Es nulo:

not (Price lt 0 or Price gt 0)

Estoy adivinando en su caso, usted puede hacer lo mismo en LINQ probando si fooBar.Termination_Date es menor o mayor que DateTime.UtcNow por ejemplo. Algo como esto:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top