2009-03-10 6 views
7

yo estaba tratando de crear dinámicamente un predicado Cuando para una consulta LINQ2SQL:Diferencia entre Expression.Call overloads?

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

A, B, C, etc. venir de alguna matriz. Así que he intentado lo siguiente:

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

Sin embargo, la última línea de falla con el mensaje Ningún método 'Me gusta' en 'System.Data.Linq.SqlClient.SqlMethods' tipo es compatible con los argumentos proporcionados.

así que traté de la línea siguiente:

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

Esto funciona. Sin embargo, no entiendo cuál es la diferencia entre estas dos líneas. En mi opinión, deberían ofrecer el mismo resultado.

¿Alguien podría explicar esto?

Saludos cordiales,
Ronald Wildenberg

Respuesta

9

creo que el argumento Type[] es para parámetros genéricos de tipo - es decir, que estaba intentando ponerse en contacto:

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

intenta pasar un vacío Type[].


Edite la confusión (comentarios); mi punto es: no debería especificar nada para el argumento Type[]. O bien una matriz vacía o nula haría; por ejemplo:

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

No existe un método SqlMethods.Like que acepta argumentos de tipo genérico, por lo que esta no puede ser la diferencia entre ambas llamadas. –

+0

Te perdiste el punto de mi respuesta ... es preciso *** porque *** de esto que falla ... (genérico tipo args) –

+0

Ah, ya veo. Como siempre, es cuestión de leer la documentación cuidadosamente. Gracias por su respuesta. –

0

Usted puede utilizar la clase PredicateBuilder de Joseph Albahari y Ben Albahari para construir su predicado, donde

0

La respuesta es la siguiente:

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

Me temo que mi español no es tan bueno ... –