ToUpper () dans un Expression.Call

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