terça-feira, 4 de setembro de 2018

Como ignorar letras acentuadas na comparação de string no C# e SQL?

Ignorar acentos no C#

Para ignorar acentos, maiúsculas e minúsculas, você pode primeiro definir um método de extensão como este:

public static string RemoveAcentos(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().ToLower();
    }

Exemplo 1

            string valor = "pãO 10 Grãos".RemoveAcentos();

            if (valor == "Pão 10 Grãos".RemoveAcentos())
            {
                 // instruções
                Console.WriteLine("Iguais");
            }
            else
            {
                 // instruções                 Console.WriteLine("Diferentes");
             }

Exemplo 2

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

             var result = from p in Produtos
                      where p.Nome.ToUpper().RemoveAcentos() == queryText
                      select p;

Ignorar acentos no SQL

O nosso método, no exemplo 2, é bom se estamos apenas iterando sobre uma colecção no C#, mas se você estiver usando LINQ para SQL é preferível evitar métodos não padrão (incluindo métodos de extensão) em sua consulta LINQ. Isso ocorre porque seu código não pode ser convertido em SQL válido e, portanto, executado no SQL Server com toda a optimização de desempenho.
Como não parece haver uma maneira padrão de ignorar os acentos no LINQ para SQL, nesse caso, sugiro alterar o tipo de campo que você deseja pesquisar para não diferenciar maiúsculas e minúsculas (CI_AI):

ALTER TABLE Produtos ALTER COLUMN Nome [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI

Sua consulta deve agora ignorar a acentuação e o caso.

É importante que você deve remover temporariamente quaisquer restrições exclusivas no campo antes de executar a consulta acima usando, por exemplo, a seguinte instrução:

ALTER TABLE People DROP CONSTRAINT UQ_Produtos_Nome

Agora a nossa consulta LINQ será simplificada:

var result = from p in Produtos
         where p.Nome == filter
         select p;

Espero ter ajudado.



Related Articles

0 comentários:

Enviar um comentário

Pesquisar neste blogue

Com tecnologia do Blogger.

Páginas