Saltar al contenido

LINQ donde ignorar acentuación y mayúsculas y minúsculas

Julio, parte de este gran staff, nos hizo el favor de crear este artículo porque domina perfectamente el tema.

Solución:

Para ignorar mayúsculas y minúsculas y acentos (diacríticos), primero puede definir un método de extensión como este:

    public static string RemoveDiacritics(this String s)
    
        String normalizedString = s.Normalize(NormalizationForm.FormD);
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < normalizedString.Length; i++)
        
            Char c = normalizedString[i];
            if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                stringBuilder.Append(c);
        

        return stringBuilder.ToString();
    

(Modificado de Ignorar letras acentuadas en string comparación)

Ahora puedes ejecutar tu consulta:

string queryText = filter.ToUpper().RemoveDiacritics();

var result = from p in People
         where p.Name.ToUpper().RemoveDiacritics() == queryText
         select p;

Esto está bien si solo está iterando sobre una colección en C#, pero si está usando LINQ to SQL, es preferible evitar métodos no estándar (incluidos los métodos de extensión) en su consulta LINQ. Esto se debe a que su código no se puede convertir en SQL válido y, por lo tanto, ejecutarse en SQL Server con toda su hermosa optimización de rendimiento.

Dado que no parece haber una forma estándar de ignorar los acentos dentro de LINQ to SQL, en este caso sugeriría cambiar el tipo de campo que desea buscar para que no distinga entre mayúsculas y minúsculas ni acentos (CI_AI).

Con tu ejemplo:

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

Su consulta ahora debe ignorar la acentuación y el caso.

Tenga en cuenta que deberá eliminar temporalmente cualquier restricción única en el campo antes de ejecutando la consulta anterior, por ejemplo

ALTER TABLE People DROP CONSTRAINT UQ_People_Name

Ahora su consulta LINQ sería simplemente:

var result = from p in People
         where p.Name == filter
         select p;

Ver pregunta relacionada aquí.

Comentarios y puntuaciones del artículo

Te invitamos a corroborar nuestra ocupación ejecutando un comentario y dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *