Este código faz distinção entre maiúsculas e minúsculas, como torná-lo sem distinção entre maiúsculas e minúsculas?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Respostas:
Supondo que estamos trabalhando com strings aqui, aqui está outra solução "elegante" usando
IndexOf()
.fonte
fonte
IEqualityComparer<string>
atributo para manipular como a comparação funcionará. Use ToLower e ToUpper para verificar a igualdade é uma má idéia. Tente:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
por exemploError 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
withStringComparer
não recebe string como parâmetro, portanto, haverá erro de construção.IndexOf
emQueryable
, provavelmente, não pode ser traduzido em SQL. Pessoalmente, achei essa resposta totalmente válida quando falamos sobre LINQ to database.Se a consulta LINQ for executada no contexto do banco de dados, uma chamada para
Contains()
será mapeada para oLIKE
operador:.Where(a => a.Field.Contains("hello"))
torna-seField LIKE '%hello%'
. OLIKE
operador não diferencia maiúsculas de minúsculas por padrão, mas isso pode ser alterado alterando o agrupamento da coluna .Se a consulta LINQ for executada no contexto .NET, você poderá usar IndexOf () , mas esse método não é suportado no LINQ to SQL.
O LINQ to SQL não oferece suporte a métodos que usam um CultureInfo como parâmetro, provavelmente porque não pode garantir que o servidor SQL manipule culturas da mesma forma que o .NET. Isso não é totalmente verdade, porque ele faz suporte
StartsWith(string, StringComparison)
.No entanto, ele não parece oferecer suporte a um método que é avaliado
LIKE
em LINQ to SQL e em uma comparação sem distinção entre maiúsculas e minúsculas no .NET, tornando impossível executar Contains () sem diferenciação de maiúsculas e minúsculas de maneira consistente.fonte
insensitive
pesquisa de caso e, no outro, precisocase sensitive
. Eu só tenho que aguentar o desempenho e usar 'toLower ()'?A resposta aceita aqui não menciona o fato de que, se você tiver uma sequência nula, ToLower () lançará uma exceção. A maneira mais segura seria fazer:
fonte
Usando o C # 6.0 (que permite funções corporais de expressão e propagação nula), para LINQ to Objects, isso pode ser feito em uma única linha como esta (também verificando se é nulo):
fonte
IndexOf funciona melhor neste caso
fonte
Você pode usar string.Compare
se você quiser apenas verificar o conteúdo, use "Qualquer"
fonte
fonte
fonte
Honestamente, isso não precisa ser difícil. Pode parecer que no início, mas não é. Aqui está uma consulta linq simples em C # que faz exatamente como solicitado.
No meu exemplo, estou trabalhando com uma lista de pessoas que têm uma propriedade chamada FirstName.
Isso pesquisará o banco de dados na pesquisa em minúsculas, mas retornará resultados completos.
fonte
Use o método String.Equals
fonte