.NET 3.5, C#¿Puede LINQ to SQL consultar un campo XML DB-serverside?
Tengo una aplicación web con una función de "búsqueda". Algunos de los campos que se pueden buscar son columnas de primera clase en la tabla, pero algunos de ellos son, de hecho, campos anidados dentro de un tipo de datos XML.
Anteriormente, construí un sistema para construir dinámicamente el SQL para mi búsqueda. Tenía una buena jerarquía de clases que creaba expresiones SQL y sentencias condicionales. El único problema era que no era seguro contra ataques de inyección SQL.
Estaba leyendo el excelente artículo de Rob Conery (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/) que indica que múltiples consultas pueden combinarse en una única consulta TSQL para el servidor si el resultado IQueryable nunca se enumera. Esto me hizo pensar que la construcción de mi búsqueda dinámica era demasiado complicada, solo necesitaba combinar múltiples expresiones LINQ.
Por ejemplo (artificial):
Autor: ID (int), LastName (varchar (32)), FirstName (varchar (32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
resultados en las siguientes consulta:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Me di cuenta de que esta podría ser la solución perfecta para una simple generación de consultas dinámicas segura de SQL Inyección: simplemente recorro mi resultado IQueryable y ejecuto expresiones condicionales adicionales para obtener mi expresión de ejecución única final.
Sin embargo, no puedo encontrar ningún soporte para la evaluación de datos XML. En TSQL, para obtener un valor de un nodo XML, que haría algo así
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Pero no puedo encontrar el LINQ a SQL equivalente a crear esta evaluación. ¿Existe uno? Sé que puedo evaluar todas las condiciones no XML de la base de datos, y luego hacer mi evaluación XML del lado del código, pero mis datos son lo suficientemente grandes que A) eso es mucho tráfico de red para arrastrar el rendimiento y B) Saldré excepciones de memoria si no puedo evaluar el primer lado de la base de datos XML para excluir ciertos conjuntos de resultados.
Ideas? Sugerencias?
Pregunta de bonificación: si la evaluación XML es, de hecho, posible de lado DB, ¿qué pasa con el soporte de FLWOR?
es a finales de 2013 - las actualizaciones? –
@BenjaminGruenbaum Ha pasado mucho tiempo desde que pensé en esta pregunta. Mi caso de uso desapareció cuando cambié de trabajo entre entonces y ahora. Lo mejor que puedo recordar es que utilicé el enfoque recomendado por DanialM a continuación, que consistía en hacer una llamada a una función definida por el usuario. No puedo decir que he notado un soporte directo en LINQ desde entonces (pero tampoco he estado buscando) – Matt
Interesante - Trataré de obtener nuevas respuestas 5 años después con una recompensa. –