2010-03-05 8 views
8

consulta Differences between LINQ to Objects and LINQ to SQL queriesCaso cadena insensible comparar con LINQ a SQL y LINQ a objetos

Estamos utilizando los algunas consultas más de nuestra base de datosy nuestra en la memoria objetos.

¿Cuál es la mejor manera de hacer una cadena insensible comparar con linq-to-sql para que?

  • Se corre rápido en SQL Server
  • La misma expresión de consulta se puede utilizar con LINQ a objetos para conseguir el mismo resultado

Usando

a.ToLowerInvariant() == b.ToLowerInvariant() 

al menos consigue los mismos resultados, pero no se procesa en el servidor SQL por lo que puedo decir, entonces puede ser mucho más lento que

a == b 
+0

¡Escriba un procedimiento almacenado! – RBarryYoung

+2

@Rbarry ¿Cómo ayuda un Procedimiento almacenado a ejecutar una consulta sobre nuestros objetos en memoria? –

+0

Ah. Buen punto (duh). No importa ... – RBarryYoung

Respuesta

0

No soy un experto en linq a sql, pero podría usar el método de cadena ToUpperInvariant() antes de comparar.

+0

Gracias, el problema es que no obtendrá el proceso en el servidor sql en la medida de lo posible, por lo que se arrastrarán muchas filas en el próximo trabajo. Mientras escribía la respuesta, intentaba ToLowerInveriant() que al menos pasaran las pruebas de mi unidad. –

1

Aquí está la lista de las operaciones de cadenas apoyadas en LINQ a SQL, lo que, obviamente, trabajar en LINQ a objetos: http://msdn.microsoft.com/en-us/library/bb882672.aspx

Yo personalmente no he evaluado cada uno por su rendimiento, pero ToLower y ToUpper no son compatibles con LINQ to SQL, por lo que parece que Compare es un buen candidato. Puede explorar el SQL traducido utilizando una herramienta como LINQPad, que tiene una versión gratuita y traduce una consulta en la base de datos SQL, y ver cómo se ejecuta contra la base de datos.

Además, LINQ a Objetos probablemente difiere por lo que es bueno para uno puede no ser bueno para el otro ...

+0

necesitamos ejecutar un poco de "filtro" en los datos almacenados y los datos en tiempo real, por lo que el uso de la consulta linq conduce a un buen código.¡Si solo hiciera lo mismo! –

6

entre mayúsculas y minúsculas en su base de datos SQL está determinada por la configuración de intercalación. De forma predeterminada, creo que la mayoría de las bases de datos no distinguen entre mayúsculas y minúsculas, por lo que debe comprobar si realmente necesita manejar la sensibilidad de mayúsculas/minúsculas de forma explícita.

En una configuración de intercalación de SQL_Latin1_General_CP1_CI_AS - CI significa sensible a mayúsculas y AS gradas para el acento sensible.

Desafortunadamente, Linq-to-Sql ignora los parámetros adicionales de String.Compare() por lo que no podrá establecer explícitamente la sensibilidad de mayúsculas y minúsculas para comparar. Sin embargo, funcionará con linq para objetos.

Si utiliza una intercalación sensible a las mayúsculas y minúsculas, puede usar algo como SqlMethods.Like(field, "string") para usar una consulta LIKE, que no distingue entre mayúsculas y minúsculas, pero que no se traduce en linq a los objetos.

+2

+1: este es el corazón del problema. – RBarryYoung