Question

J'ai ceci:

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

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

Le "uen.GetPropValue<string>(sortName)" sera rempli dynamiquement avec le nom de tri que l'utilisateur a saisi dans la page.

Par exemple, si un utilisateur recherche une personne nommée & "Joe &"; l'extrait sera:

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

Mais je rencontre des problèmes avec LINQ. Les recherches sensibles à la casse. Si je tape & "Joe &", Je ferai quelque chose. Par contre, si je tape & "Joe &", Cela n’apporte rien.

Comment puis-je créer ceci & "Contains (sortName) &"; fonctionne avec Case-Insensitive ?? J'ai essayé certaines choses avec String.Comparer mais il rapporte des erreurs sur la solution de construction.

Merci !!

Était-ce utile?

La solution

Je pense que ce qui suit va générer le bon code SQL:

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

Autres conseils

S'il s'agit vraiment de LINQ-to-SQL, essayez d'utiliser SqlMethods.Like à la place de String.Contains.

Cependant, je pense que le problème est qu’il ne s’agit pas de LINQ-to-SQL, car vous utilisez des délégués au lieu d’arbres d’expression. Donc, ceci est amené côté client, puis exécuté localement (& "; LINQ to Objects &";). String.Contains fait donc ce qu’il fait localement.

De cette manière, la réponse de James est correcte car il appelle ToLower () à la fois sur la valeur et sur la requête. (Méfiez-vous des questions relatives à la culture - précisez peut-être quelle culture vous souhaitez.)

Vous pouvez également utiliser la méthode String.IndexOf (String, Int32, StringComparison) ( http://msdn.microsoft.com/en-us/library/ms224424.aspx ). Cette méthode vous permet de spécifier si la correspondance doit être faite en respectant la casse ou non, et si elle doit utiliser une culture invariante ou non.

Donc dans votre exemple:

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

Je ne me demande pas s'il s'agit d'une meilleure solution que celle fournie par James Curran. Cela pourrait ou ne pourrait pas être, en termes de performances.

Ceci est le code complet:

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));

La méthode d'extension GetPropValue est:

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top