Pergunta

eu tenho este:

var sortName = Request.Params["sortName"];
var query = Request.Params["query"];

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));

O "uen.GetPropValue<string>(sortName)" será preenchido dinamicamente com o sortName o usuário digitou na página.

Por exemplo, se um usuário olha para uma pessoa chamada "Joe", o trecho será:

(uen => uen.namePerson.Contains(Joe))

Mas, eu estou tendo problemas com LINQ pesquisas maiúsculas de minúsculas. Se eu digitar "Joe", eu vou alguma coisa. Por outro lado, se eu digitar "Joe", que não trazem nada.

Como posso fazer isso "Contém (sortName)" Funciona com o Case-Insensitive ?? Eu tentei algumas coisas com String.Comparer mas relata erros na solução de construção.

Graças !!

Foi útil?

Solução

Eu acredito que a seguir irá gerar SQL adequada:

 uen=>(uen.GetPropValue<string>(sortName)).ToLower().Contains(query.ToLower()))

Outras dicas

Se este é realmente LINQ to SQL, tente usar o SqlMethods.Like método em vez de String.Contains.

No entanto, acho que o problema é que este não é o LINQ to SQL, porque você está usando delegados em vez de Árvores de expressão. Portanto, este está sendo trazido do lado do cliente, em seguida, executado localmente ( "LINQ to Objects"). Assim, String.Contains está fazendo o que ele faz no local.

Nesse sentido, a resposta de James é correto, já que ele está chamando ToLower () sobre o valor e a consulta. (Embora, cuidado com as questões de cultura -. Talvez especificar qual a cultura que você quer)

Você também pode usar o método String.IndexOf (String, Int32, StringComparison) ( http://msdn.microsoft.com/en-us/library/ms224424.aspx ). Este método permite que você especifique se a correspondência deve ser feito caso-sensível ou não, e se ele deve usar uma cultura invariável ou não.

Assim, no seu exemplo:

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).IndexOf(query, 0, StringComparison.OrdinalIgnoreCase));

Eu não estou comentando sobre se esta é uma solução melhor do que a fornecida por James Curran. Ele podia ou não podia ser, desempenho sábio.

Este é o código inteiro:

var sortOrder    = Request.Params["sortorder"];    
var sortName     = Request.Params["sortname"];
var query        = Request.Params["query"];

IEnumerable<UsuarioEndereco> pagedEndereco;

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));
pagedEndereco = sortOrder.Equals("asc", StringComparison.CurrentCultureIgnoreCase) ?
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderByDescending(uen => uen.GetPropValue<IComparable>(sortName)) :
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderBy(uen => uen.GetPropValue<IComparable>(sortName));

O Método de extensão GetPropValue é:

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top