Esta não é uma comparação que diferencia maiúsculas de minúsculas no LINQ to Entities:
Thingies.First(t => t.Name == "ThingamaBob");
Como posso fazer uma comparação que diferencia maiúsculas de minúsculas com o LINQ to Entities?
c#
.net
entity-framework-4
linq-to-entities
Ronnie Overby
fonte
fonte
Respostas:
Isso porque você está usando LINQ To Entities, que, em última análise, converte suas expressões Lambda em instruções SQL. Isso significa que a diferenciação de maiúsculas e minúsculas está à mercê de seu SQL Server, que por padrão tem SQL_Latin1_General_CP1_CI_AS Collation e NÃO diferencia maiúsculas de minúsculas.
Usar ObjectQuery.ToTraceString para ver a consulta SQL gerada que foi realmente enviada ao SQL Server revela o mistério:
Quando você cria uma consulta LINQ to Entities , LINQ to Entities aproveita o analisador LINQ para começar a processar a consulta e convertê-la em uma árvore de expressão LINQ. A árvore de expressão LINQ é então passada para a API de serviços de objeto , que converte a árvore de expressão em uma árvore de comando. Em seguida, ele é enviado ao provedor de armazenamento (por exemplo, SqlClient), que converte a árvore de comando no texto de comando do banco de dados nativo. A consulta é executada no armazenamento de dados e os resultados são materializados em objetos de entidade por serviços de objeto. Nenhuma lógica foi colocada no meio para levar em consideração a diferenciação de maiúsculas e minúsculas. Portanto, não importa que caso você coloque em seu predicado, ele sempre será tratado como o mesmo pelo seu SQL Server, a menos que você altere seus agrupamentos do SQL Server para essa coluna.
Solução do lado do servidor:
Portanto, a melhor solução seria alterar o agrupamento da coluna Nome na tabela Thingies para COLLATE Latin1_General_CS_AS, que diferencia maiúsculas de minúsculas executando-o em seu SQL Server:
Para obter mais informações sobre o SQL Server Collates , dê uma olhada em SQL SERVER Collate Pesquisa de consulta SQL sensível a maiúsculas e minúsculas
Solução do lado do cliente:
A única solução que você pode aplicar no lado do cliente é usar LINQ to Objects para fazer outra comparação que não parece ser muito elegante:
fonte
Você pode adicionar a anotação [CaseSensitive] para EF6 + Code-first
Adicionar esta classe
Modifique seu DbContext, adicione
Então faça
Add-Migration CaseSensitive
Atualizar o banco de dados
com base no artigo https://milinaudara.wordpress.com/2015/02/04/case-sensitive-search-using-entity-framework-with-custom-annotation/ com alguma correção de bug
fonte
WHERE
as condições no SQL Server não diferenciam maiúsculas de minúsculas por padrão. Faça distinção entre maiúsculas e minúsculas alterando os agrupamentos padrão da coluna (SQL_Latin1_General_CP1_CI_AS
) paraSQL_Latin1_General_CP1_CS_AS
.A maneira frágil de fazer isso é com código. Adicione um novo arquivo de migração e, em seguida, adicione-o dentro do
Up
método:Mas
Você pode criar uma anotação personalizada chamada "CaseSensitive" usando os novos recursos do EF6 e pode decorar suas propriedades assim:
Esta postagem do blog explica como fazer isso.
fonte
A resposta dada por @Morteza Manavi resolve o problema. Ainda assim, para uma solução do lado do cliente , uma maneira elegante seria a seguinte (adicionando uma dupla verificação).
fonte
Gostei da resposta de Morteza e normalmente prefiro consertar no servidor. Para o lado do cliente, eu normalmente uso:
Basicamente, primeiro verifique se existe um usuário com os critérios exigidos, depois verifique se a senha é a mesma. Um pouco prolixo, mas acho que é mais fácil de ler quando pode haver um monte de critérios envolvidos.
fonte
Nenhum dos
StringComparison.IgnoreCase
funcionou para mim. Mas isso fez:fonte
How can I achieve case sensitive comparison
Use string.Equals
Além disso, você não precisa se preocupar com null e obter de volta apenas as informações que deseja.
Use StringComparision.CurrentCultureIgnoreCase para não diferenciar maiúsculas de minúsculas.
fonte
Não tenho certeza sobre o EF4, mas o EF5 oferece suporte para:
fonte
StringComparison
que diferencia maiúsculas de minúsculas no banco de dados, não consegui fazer com que esta ou qualquer uma das outras enums fizesse diferença. Já vi pessoas suficientes sugerindo que esse tipo de coisa deve funcionar para pensar que o problema está em algum lugar no arquivo EDMX (db-first), embora stackoverflow.com/questions/841226/…