10

Tengo un sitio web existente desarrollado utilizando ASP.NET MVC 3 y Entity Framework 4 consultando una base de datos Sql Server 2008. Contiene un formulario de búsqueda con alrededor de 10 campos, y cuando el usuario hace clic en el botón Enviar, creo dinámicamente una solicitud de Entity SQL que contiene solo los campos de búsqueda especificados, omitiendo los vacíos. Funciona. Hasta aquí todo bien.Sql Server texto libre a través de Entity Framework

Ahora, el cliente desea un comportamiento de búsqueda de texto completo para uno de los campos. Veo esta solicitud por ser bastante compleja porque (que yo sepa): No

  • Entity Framework no admite de forma nativa búsqueda de texto completo
  • que quieren evitar procedimientos almacenados para envolver la sintaxis FTS ya que hasta ahora sólo he utilizado SP "estáticos", manteniendo la lógica en el código .NET. Así que quiero tratar de evitar construir la consulta dentro del procedimiento. Y crear un procedimiento por combinación de campo de búsqueda posible no es una opción.

Soluciones me ocurrieron hasta ahora:

  • Poner un procedimiento almacenado o una función definida por el usuario como un preadicate seach en la cláusula WHERE (no estoy seguro de que es posible, aunque)
  • Conseguir el FTS resulta solo en una tabla temporal y ejecuta los otros filtros en esa tabla temporal. Me temo que las actuaciones no son buenas si hay muchos resultados FTS con esta técnica ...

¿Cuál es la mejor manera de hacer daling con esto?

Respuesta

6

¿No puede simplemente usar raw sql? entonces puedes mantener la lógica en tu código .NET.

Por lo tanto, sería algo como:

string sql = "DO FULLTEXT STUFF"; 
MyObjectContext.ExecuteStoreQuery<MyEntity>(sql, .......); 
+0

+1 Este es buen punto. Al hacerlo de esta manera, incluso puede introducir la búsqueda de texto completo en el servidor SQL. Creo que 'sp_executesql' no es necesario porque lo usa' ExecuteStoreCommand' directamente. –

+2

Gracias por esta sugerencia. Traté de mejorarlo manteniendo la creación de consultas de entidad, luego generando la consulta SQL resultante y reemplazando la precía LIKE con una FREETEXT, antes de ejecutarla. – Shtong

1

No tiene que pensar en el rendimiento: esto será lento de todos modos porque reemplazará la búsqueda indexada de texto completo con la cadena estándar que compara el valor concatenado.

Hay tres maneras de ir:

  • crear dinámicamente consulta ESQL como lo hace ahora, sino del uso como el valor concatenado de sus columnas
  • usuario función SQL definida o model defined function para la evaluación de verificación de búsqueda importada a su Modelo EDMX y expuesto para consultas de Linq a entidades.
  • En lugar de buscar directamente en la tabla, use la vista con la columna calculada (que contiene los diez campos) y ejecute el "texto completo" en esa columna.

Cualquiera de estos métodos no es una solución para el rendimiento.

Cuestiones relacionadas