2008-11-26 34 views
10

¿Cómo puedo ignorar los acentos (como ', `, ~) en las consultas realizadas en una base de datos de SQL Server utilizando LINQ to SQL?Ignorar acentos en SQL Server utilizando LINQ to SQL

ACTUALIZACIÓN:

Aún no han descubierto la manera de hacerlo en LINQ (o incluso si es posible), pero me las arreglé para cambiar la base de datos para resolver este problema. Solo tuve que cambiar la intercalación en los campos en los que quería buscar. La colación que tenía era:

SQL_Latin1_General_CP1_CI_AS 

El CI stans para "mayúsculas y minúsculas" y en cuanto a "acento sensible". Solo tuve que cambiar el AS a AI para hacerlo "Acento insensible". La instrucción SQL es la siguiente:

ALTER TABLE table_name ALTER COLUMN column_name column_type COLLATE collation_type 
+0

Solo cierre los ojos ... – NotMe

+0

El propósito de las etiquetas no es simplemente inventar algo, el tema es linq, entonces simplemente use 'linq', no cree 'sqltolinq' porque nadie más usará tales una etiqueta aleatoria de nuevo, por lo que es un desperdicio. – TravisO

+0

Hhmm, no solo creé una nueva etiqueta, utilicé 'linqtosql' que se ha usado en aproximadamente 290 preguntas ... – Farinha

Respuesta

2

En las consultas SQL (SQL Server 2000 +, por lo que recuerdo), esto se hace haciendo algo como seleccione MiCadena, MyID de MiTabla donde MiCadena cotejar Latin1_General_CI_AI = 'AAAA'.

No estoy seguro de si esto es posible en Linq, pero alguien más acogedor con Linq probablemente pueda traducirlo.

Si está de acuerdo con la clasificación y seleccione/donde las consultas SIEMPRE ignoran los acentos, puede modificar la tabla para especificar la misma intercalación en el (los) campo (s) que le interesan.

+0

Aquí hay un ejemplo, probablemente lo recogí de una de mis búsquedas web pero no recuerdo la URL. SELECT * DE NameTable WHERE nombre = 'Abbee' INTERCALAR Latin1_General_CI_AI - entre mayúsculas y minúsculas, la comparación Y COMO '% Accent%' COLLATE Latin1_General_CI_AS Accent-Insensible - entre mayúsculas y minúsculas, Accent-Sensible comparación ORDER BY DESC COLLATE Latin1_General_CS_AS - Tipo de orden sensible a mayúsculas/minúsculas y acentuado – Raj

1

LINQ to SQL no tiene ninguna funcionalidad específica para establecer la intercalación utilizada para una consulta y siempre usará la base de datos predeterminada.

2

Ver la siguiente respuesta:

LINQ Where Ignore Accentuation and Case

Básicamente lo que necesita para alterar el tipo de campo en SQL Server, por ejemplo,

ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI 

No parece ser una manera de hacer esto utilizando LINQ, además de llamar a un método personalizado para eliminar los signos diacríticos (lo cual no sería performant).

1

Parece que hay una manera de hacer caso omiso de las diferencias de colación en LINQ to SQL mediante el uso de T-SQL funciones:

CREATE FUNCTION [dbo].[func_ConcatWithoutCollation] 
(
    @param1 varchar(2000), 
    @param2 varchar(2000) 
) 
RETURNS varchar(4000) 
AS 
BEGIN 
    IF (@param1 IS NULL) SET @param1 = '' 
    IF (@param2 IS NULL) SET @param2 = '' 
    RETURN @param1 COLLATE Latin1_General_CS_AS + @param2 COLLATE Latin1_General_CS_AS 
END 

para conseguir esta función en LINQ to SQL, hay un interruptor para SQLMetal:/funciones. Ejemplo:

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Bin\SqlMetal.exe" /server:. /database:NameOfDatabase /pluralize /code:ContextGenerated.cs /sprocs /views /functions 

Utilice esta función en LINQ a SQL como esto:

from s in context.Services 
where context.Func_ConcatWithoutCollation(s.Description, s.Email) == "whatever" 
select s 

Me ayudó, tal vez alguien encuentra este útil también.