2011-04-22 19 views
6

Estoy tratando de implementar una consulta para una de mis tablas de Azure, la consulta debe recuperar todos los archivos que contienen la cadena de entrada.Windows Azure Tables, consultando con Contiene

He intentado usar string.contains() pero esto no es compatible con Azure, también he probado string.startswith() esto tampoco es compatible.

Lo que me pregunto es si hay una forma de hacerlo en Azure Tables. Estoy almacenando información de archivo en las tablas y la clave de partición es la ruta virtual del artículo almacenado.

p. Ej. Images_Jpg_Image1.jpg sería una clave de partición para uno de los archivos, he usado '_' porque Azure no permitirá '/' en las claves de partición.

Me gustaría ser capaz de comparar la clave de partición anterior con

Lo ideal sería que las siguientes cadenas volvería esa partición clave

Images_ Images_Jpg Jpg_ Image1.jpg

tengo todas las tablas configuradas y todas las otras consultas, es solo esta consulta que no puedo entender.

Gracias de antemano por cualquier ayuda,

Matt

Respuesta

3

Tabla de datos soporta el método CompareTo que puede ser utilizado como un StartsWith. Pero aún puede no funcionar para usted en función de los tipos de búsqueda que está tratando de hacer.

MyTable.Where(t => t.PartitionKey.CompareTo("image") >= 0).ToList(); 
+0

Esto es casi lo mejor que podría esperar, pero no encontrará el caso Jpg_Image1.jpg. También es sensible a mayúsculas y minúsculas. Tampoco se limita a los elementos que comienzan con "imagen". Si devuelve 1000 resultados y solo los primeros 300 comienzan con la imagen, obtendrá los siguientes 700 artículos de la tabla. – knightpfhor

+0

. Donde está arrojando un error de sintaxis para mí. Añadí el espacio de nombres linq. ¿Cualquier sugerencia? – Kurkula

2

que se han encontrado con problemas similares con las búsquedas en tablas de Azure que buscan en los nombres y asegurarse de que los resultados fueron caso invariante.

Lo que terminé haciendo fue en realidad cargar los datos que necesitaba de las tablas de Azure a una colección de memoria que se conserva en una colección consultable. Luego pude usar Linq para objetos para consultar y obtener los resultados que quería.

No es un enfoque elegante, pero si la recopilación de datos no es enorme y está relativley estático, el tamaño del objeto en la memoria será relativamente benigno en comparación con la cantidad de memoria que tiene la máquina virtual. El rendimiento también fue mucho más rápido.

También podría intentar y simplemente tener la clave de Partición/fila y los datos que está tratando de consultar en memoria, ejecutar su consulta, repetir las teclas de partición y de fila y devolver los resultados. No estoy seguro de si eso ayudará a resolver su pregunta, pero lo descarto como un posible enfoque.

¡Buena suerte!

John

+0

Gracias por la respuesta John, echaré un vistazo a esto. Estoy tentado de cambiar a Azure SQL a través de – Midimatt

+0

Entiendo :) Para nosotros, era mucho más barato usar el almacenamiento de tabla Azure VS SQL. Cada caso es diferente, bla, bla, bla :) –

+0

Vale la pena señalar que si el código que realiza la consulta es local para la región azul (es decirescribió un servicio que se ejecuta en Azure, "al lado" de su cuenta de almacenamiento), entonces el rendimiento debería ser correcto, y no pagará las tarifas de transferencia de datos (tarifa de salida, siempre que se encuentre en la misma región de Azure) Esto hace que esta respuesta sea buena si la arquitectura de su aplicación se ajusta a ese modelo. –

-1

me encontré con la consulta de la tabla de almacenamiento de Azure usando LINQPad muy práctico. Consulte el blog Jason Halley's para obtener más información y ejemplos.