2009-03-10 12 views
7

Stavo tentando di creare dinamicamente un predicato Dove per una query LINQ2SQL:Differenza tra i sovraccarichi di Expression.Call?

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

A, B, C, ecc provengono da alcune serie. Così ho provato la seguente:

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

Tuttavia, l'ultima linea non riesce con il messaggio Nessun metodo di 'Like' su di tipo 'System.Data.Linq.SqlClient.SqlMethods' è compatibile con gli argomenti forniti.

così ho provato la seguente riga:

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

Questo funziona. Tuttavia, non capisco qual è la differenza tra queste due linee. Secondo me dovrebbero consegnare lo stesso risultato.

Qualcuno potrebbe spiegarlo?

Cordiali saluti,
Ronald Wildenberg

risposta

9

credo che l'argomento Type[] è per parametri generici di tipo - vale a dire che si stavano cercando di chiamare:

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

Prova a passare un vuoto Type[].


Modificare la confusione (commenti); il mio punto è: non si dovrebbe specificare nulla per l'argomento Type[]. O avrebbe fatto un array vuoto o null; per esempio:

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

Non esiste un metodo SqlMethods.Like che accetta argomenti di tipo generico, quindi questa non può essere la differenza tra le due chiamate. –

+0

Hai perso il punto della mia risposta ... è precisissimo *** perché *** di ciò che non riesce ... (tipo generico args) –

+0

Ah, capisco. Come sempre, si tratta di leggere attentamente la documentazione. Grazie per la tua risposta. –

0

È possibile utilizzare la classe PredicateBuilder da Giuseppe Albahari e Ben Albahari per costruire la vostra dove predicato

0

La risposta è la seguente:

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

Ho paura che il mio spagnolo non sia così buono ... –

Problemi correlati