2009-03-10 2 views
7

je tentais de créer dynamiquement un cas prédicat pour une requête LINQ2SQL:Différence entre les surcharges Expression.Call?

...Where(SqlMethods.Like(r.Name, "%A%") || 
     SqlMethods.Like(r.Name, "%B%") || 
     SqlMethods.Like(r.Name, "%C%") || ...) 

A, B, C, etc. proviennent de quelque tableau. J'ai donc essayé les éléments suivants:

var roleExpression = Expression.Parameter(typeof(Role), r); 
var nameExpression = Expression.Property(roleExpression, "Name"); 
var termExpression = Expression.Constant("%" + term[i] + "%"); 
var likeExpression = Expression.Call(
    typeof(SqlMethods), "Like", 
    new[] { typeof(string), typeof(string) }, nameExpression, termExpression); 

Cependant, la dernière ligne échoue avec le message Aucune méthode « Like » sur le type « System.Data.Linq.SqlClient.SqlMethods » est compatible avec les arguments fournis.

donc j'ai essayé la ligne suivante:

var likeExpression = Expression.Call(null, 
    typeof(SqlMethods).GetMethod("Like", new[] { typeof(string), typeof(string) }), 
    nameExpression, searchTermExpression) 

Cela fonctionne. Cependant, je ne comprends pas quelle est la différence entre ces deux lignes. À mon avis, ils devraient donner le même résultat.

Quelqu'un peut-il expliquer cela?

Cordialement,
Ronald Wildenberg

Répondre

9

Je crois que l'argument Type[] est pour paramètres de type générique - à savoir que vous essayez d'appeler:

SqlMethods.Like<string,string>(...); // note the <string,string> 

Essayez de passer un Type[] vide.


Modifier la confusion (commentaires); mon point est: vous ne devriez pas spécifier quoi que ce soit pour l'argument Type[]. Un tableau vide ou nul ferait l'affaire; par exemple:

var likeExpression = Expression.Call(
    typeof(SqlMethods), "Like", null, nameExpression, termExpression); 
+0

Il n'y a pas de méthode de SqlMethods.Like qui accepte les arguments de type générique, donc cela ne peut pas être la différence entre les deux appels. –

+0

Vous avez manqué le point de ma réponse ... c'est preciseley *** parce que *** de ce qu'il échoue ... (args de type générique) –

+0

Ah, je vois. Comme toujours, il s'agit de lire attentivement la documentation. Merci pour votre réponse. –

0

Vous pouvez utiliser la classe PredicateBuilder de Joseph Albahari et Ben Albahari pour construire votre où prédicat

0

La réponse est la suivante:

Expression.Call(Nothing, GetType(System.Data.Linq.SqlClient.SqlMethods).GetMethod("Like", New Type() {GetType(String), GetType(String)}), New Expression() {left, right}) 
+0

J'ai peur que mon espagnol ne soit pas si bon ... –