Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Linq to Entities:usando ToLower() em campos NText


Nunca use .ToLower() para executar uma comparação que não diferencia maiúsculas de minúsculas. Aqui está o porquê:
  1. Talvez esteja errado (seu agrupamento de cliente pode ser, digamos, turco, e seu agrupamento de banco de dados não).
  2. É altamente ineficiente; o SQL emitido é LOWER em vez de = com um agrupamento que não diferencia maiúsculas de minúsculas.

Em vez disso, use StringComparison.OrdinalIgnoreCase ou StringComparison.CurrentCultureIgnoreCase :
var q = from f in Context.Foos
        where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
        select f;

Mas para Contains() há um problema:Ao contrário de Equals , StartsWith , etc., ele não tem uma sobrecarga para um StringComparison argumento. Por quê? Boa pergunta; pergunte à Microsoft.

Isso, combinado com a limitação do SQL Server em LOWER significa que não há uma maneira simples de fazer o que você quer.

As possíveis soluções alternativas podem incluir:
  • Use um índice de texto completo e faça a pesquisa em um procedimento.
  • Use Equals ou StartsWith em vez disso, se possível para sua tarefa
  • Alterar o agrupamento padrão da coluna?