Le code ci-dessous fonctionne, mais j’aimerais introduire un ToUpper()
var predicate = Expression.Lambda<Func>( Expression.Call( Expression.PropertyOrField(parameter, "FirstName"), "Contains", null, Expression.Constant("myvalue".ToUpper())), parameter );
Le résultat est :
{Param_0 => Param_0.FirstName.Contains("MYVALUE")}
Mais j’aimerais bien ceci:
{Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")}
Comment puis-je changer?
Ajoutez simplement un Expression.Call
:
var predicate = Expression.Lambda>( Expression.Call( Expression.Call( // <=== this one is new Expression.PropertyOrField(parameter, "FirstName"), "ToUpper", null), "Contains", null, Expression.Constant("myvalue".ToUpper())), parameter );
qui se présente alors comme:
Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")
EDIT: OK, je vais mal interpréter la question. Le problème est que vous appelez Contains
directement sur le résultat de l’appel de la propriété FirstName
. Vous devez d’abord appeler ToUpper
sur la propriété, par exemple
var firstName = Expression.PropertyOrField(parameter, "FirstName"); var firstNameUpper = Expression.Call(firstName, "ToUpper", null); var target = Expression.Constant("myvalue".ToUpper()); var contains = Expression.Call(firstNameToUpper, "Contains", null, target); var lambda = Expression.Lambda>(contains, parameter);
Notez que ce n’est pas “culturellement sûr” – il serait plus sûr d’utiliser une comparaison insensible à la casse. Cette question montre une approche utilisant IndexOf
, mais qui peut ne pas être prise en charge par votre fournisseur LINQ (je ne sais pas ce que vous faites avec cette arborescence d’expression par la suite).