Li que não é aconselhável usar o ToUpper e o ToLower para realizar comparações de seqüências que não diferenciam maiúsculas de minúsculas, mas não vejo alternativa quando se trata de LINQ-to-SQL. Os argumentos ignoreCase e CompareOptions de String.Compare são ignorados pelo LINQ-to-SQL (se você estiver usando um banco de dados com distinção entre maiúsculas e minúsculas, você obtém uma comparação com distinção entre maiúsculas e minúsculas, mesmo que solicite uma comparação sem distinção entre maiúsculas e minúsculas). ToLower ou ToUpper é a melhor opção aqui? Um é melhor que o outro? Pensei ter lido em algum lugar que o ToUpper era melhor, mas não sei se isso se aplica aqui. (Estou fazendo muitas revisões de código e todo mundo está usando o ToLower.)
Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0
Isso se traduz em uma consulta SQL que simplesmente compara row.Name com "test" e não retornará "Test" e "TEST" em um banco de dados com distinção entre maiúsculas e minúsculas.
LINQQuery.Contains("VaLuE", StringComparer.CurrentCultureIgnoreCase)
eLINQQuery.Except(new string[]{"A VaLUE","AnOTher VaLUE"}, StringComparer.CurrentCultureIgnoreCase)
. Wahoo!Respostas:
Como você diz, existem algumas diferenças importantes entre o ToUpper e o ToLower, e apenas uma é confiável quando você está tentando fazer verificações de igualdade sem distinção entre maiúsculas e minúsculas.
Idealmente, a melhor maneira de fazer uma verificação de igualdade que não diferencia maiúsculas de minúsculas seria :
NOTA, contudo, que isso não funciona neste caso! Portanto, estamos presos a
ToUpper
ouToLower
.Observe o Ordinal IgnoreCase para torná-lo seguro. Mas exatamente o tipo de verificação sensível a maiúsculas e minúsculas que você usa depende de quais são seus objetivos. Mas, em geral, use Equals para verificações de igualdade e Compare ao classificar e, em seguida, escolha a StringComparison correta para o trabalho.
Michael Kaplan (uma autoridade reconhecida em cultura e manipulação de personagens como essa) tem posts relevantes no ToUpper vs. ToLower:
Ele diz "String.ToUpper - use ToUpper em vez de ToLower e especifique InvariantCulture para obter as regras de uso do sistema operacional "
fonte
Eu usei
System.Data.Linq.SqlClient.SqlMethods.Like(row.Name, "test")
na minha consulta.Isso realiza uma comparação que não diferencia maiúsculas de minúsculas.
fonte
SqlClient
.Eu tentei isso usando a expressão Lambda, e funcionou.
List<MyList>.Any (x => (String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)) && (x.Type == qbType) );
fonte
List<>
ocorre porque você está usando a , o que significa que a comparação ocorre na memória (código C #), em vez de umaIQueryable
(ouObjectQuery
) que faria a comparação no banco de dados .Se você passar uma string que não diferencia maiúsculas de minúsculas para o LINQ-to-SQL, ela será passada para o SQL inalterada e a comparação ocorrerá no banco de dados. Se você deseja fazer comparações de strings sem distinção entre maiúsculas e minúsculas no banco de dados, tudo o que você precisa fazer é criar uma expressão lambda que faça a comparação e o provedor LINQ-to-SQL converterá essa expressão em uma consulta SQL com a string intacta.
Por exemplo, esta consulta LINQ:
é traduzido para o seguinte SQL pelo provedor LINQ-SQL:
Como você pode ver, o parâmetro string será comparado no SQL, o que significa que as coisas devem funcionar da maneira que você espera.
fonte
Para executar consultas Linq a Sql com distinção entre maiúsculas e minúsculas, declare que os campos 'string' diferenciam maiúsculas de minúsculas, especificando o tipo de dados do servidor usando um dos seguintes;
ou
Nota: O 'CS' nos tipos de agrupamento acima significa 'Distinção entre maiúsculas e minúsculas'.
Isso pode ser inserido no campo "Tipo de dados do servidor" ao exibir uma propriedade usando o Visual Studio DBML Designer.
Para obter mais detalhes, consulte http://yourdotnetdesignteam.blogspot.com/2010/06/case-sensitive-linq-to-sql-queries.html
fonte
fonte
A seguinte abordagem em duas etapas funciona para mim (VS2010, ASP.NET MVC3, SQL Server 2008, Linq to SQL):
fonte
!= -1
porqueIndexOf
"retorna -1 se o caractere ou a string não for encontrado"Às vezes, o valor armazenado no banco de dados pode conter espaços, portanto, a execução pode falhar
A solução para esses problemas é remover espaço, converter sua caixa e selecionar assim
Observe neste caso
nome personalizado é o valor que corresponde ao valor do banco de dados
UsersTBs é classe
title é a coluna Banco de Dados
fonte
Lembre-se de que existe uma diferença entre se a consulta funciona e se funciona com eficiência ! Uma instrução LINQ é convertida em T-SQL quando o destino da instrução é SQL Server, portanto, é necessário pensar no T-SQL que seria produzido.
É provável que o uso de String.Equals (suponho) traga de volta todas as linhas do SQL Server e faça a comparação no .NET, porque é uma expressão do .NET que não pode ser convertida em T-SQL.
Em outras palavras, o uso de uma expressão aumentará seu acesso a dados e removerá sua capacidade de usar índices. Funcionará em pequenas mesas e você não notará a diferença. Em uma mesa grande, poderia ter um desempenho muito ruim.
Esse é um dos problemas que existem com o LINQ; as pessoas não pensam mais em como as declarações que escrevem serão cumpridas.
Nesse caso, não há como fazer o que você deseja sem usar uma expressão - nem mesmo no T-SQL. Portanto, talvez você não consiga fazer isso com mais eficiência. Mesmo a resposta T-SQL fornecida acima (usando variáveis com intercalação) provavelmente resultará em índices sendo ignorados, mas se for uma tabela grande, vale a pena executar a instrução e examinar o plano de execução para verificar se um índice foi usado. .
fonte