azure - sirven - tablas para picar de polietileno
Consulta de almacenamiento de tabla azul para valores nulos (2)
Acabo de tener este problema y encontré un buen pequeño truco de ninja para probar nulos. Aunque estoy usando la interfaz de almacenamiento de Azure directamente, estoy 90% seguro de que también funcionará para LINQ si haces lo mismo.
Esto es lo que hice para comprobar si Price (Int32?) Es nulo:
not (Price lt 0 or Price gt 0)
Supongo que en tu caso, puedes hacer lo mismo en LINQ comprobando si fooBar.Termination_Date es mayor 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;
¿Alguien sabe la forma correcta de consultar un almacenamiento de tabla azul para un valor nulo? Por lo que he leído, es posible (aunque hay un error que lo impide en el almacenamiento de desarrollo). Sin embargo, sigo recibiendo el siguiente error cuando lo hago en el almacenamiento en la nube en vivo:
Una de las entradas de solicitud no es válida.
Esta es una versión simplificada de la consulta LINQ que he reunido.
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 ejecuto la consulta sin verificar si hay un valor nulo, funciona bien. Sé que una posible solución sería ejecutar una segunda consulta en la colección que esta consulta trae de vuelta. No me importa hacerlo si lo necesito, pero me gustaría saber si puedo lograr que este enfoque funcione primero.
¿Alguien ve algo obvio que estoy haciendo mal?
El problema es que debido a que el almacenamiento de la tabla azul no tiene un esquema, la columna nula en realidad no existe. Es por esto que su consulta no es válida. no existe una columna nula en el almacenamiento de tablas. Podría hacer algo como almacenar una cadena vacía si realmente tiene que hacerlo. Aunque el problema fundamental aquí es que el almacenamiento de tablas de Azure realmente no está diseñado para ser consultado por ninguna columna que no sea la clave de partición y la clave de fila. Cada vez que realiza una consulta en una de estas columnas no estándar, está realizando una exploración de tablas. Si comienza a obtener una gran cantidad de datos, tendrá una tasa muy alta de tiempos de espera de consulta. Sugeriría configurar 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 tecla Fila. En última instancia, si su aplicación no se está volviendo loca, solo usaría SQL Azure, ya que será mucho más flexible para los tipos de consultas que esté realizando.
Actualización: Azure tiene una gran guía sobre el diseño de almacenamiento de tablas que recomendaría leer. http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/