2010-09-08 31 views
5

Estoy intentando crear una consulta dinámica utilizando árboles de expresión en LINQ para representar la siguiente consultaCrear un árbol de expresión en C#

WageConstIns.Where(WageConstIn => WageConstIn.Serialno.ToString().StartsWith("2800")); 

me han tratado de crear que de este modo:

MemberExpression le1 = LinqExpression.Property(paramExp, "Serialno"); 
MethodCallExpression le2 = LinqExpression.Call(le1, typeof(string).GetMethod("ToString", System.Type.EmptyTypes)); 
ConstantExpression le3 = LinqExpression.Constant("2800"); 
MethodCallExpression le4 = LinqExpression.Call(le2, typeof(string).GetMethod("StartsWith")); 

Me aparece un error durante el tiempo de ejecución. ¿Cómo se puede construir mejor la consulta anterior usando árboles de expresiones?

+0

¿Por qué no nos dices qué error estás recibiendo? – LukeH

Respuesta

7

La forma más fácil sería simplemente declarará como un Expression<Func<...>>

public static class Program { 
    public static void Main() { 
     Expression<Func<DummyClass, Boolean>> predicate = WageConstIn => WageConstIn.Serialno.ToString().StartsWith("2800"); 
    } 
} 

Pero si quieres construirlo utilizando diferentes expresiones ...

public static class Program { 
    public static void Main() { 
     var param = Expression.Parameter(typeof(DummyClass), "WageConstIn"); 
     var constValue = Expression.Constant("2800"); 

     // WageConstIn => WageConstIn.Serialno.ToString().StartsWith(...) 
     var first = Expression.Lambda(
      parameters: param, 
      body: Expression.Call(
       instance: Expression.Call(
        instance: Expression.Property(param, "Serialno"), 
        methodName: "ToString", 
        typeArguments: null, 
        arguments: null 
       ), 
       methodName: "StartsWith", 
       typeArguments: null, 
       arguments: new[] { constValue } 
      ) 
     ); 

     // WageConstIn => Convert.ToString(WageConstIn.Serialno).StartsWith(...) 
     var second = Expression.Lambda(
      parameters: param, 
      body: Expression.Call(
       instance: Expression.Call(
        type: typeof(Convert), 
        methodName: "ToString", 
        typeArguments: null, 
        arguments: new[] { Expression.Property(param, "Serialno") } 
       ), 
       methodName: "StartsWith", 
       typeArguments: null, 
       arguments: new[] { constValue } 
      ) 
     ); 
    } 
} 

mayoría de la gente [que he hablado con] quienes ingresan al dominio de árboles de expresión usualmente están satisfechos con la funcionalidad System.Linq.Dynamic. (Que se puede abusar de muchas maneras diferentes). Este fragmento de código de genialidad pura forma parte del código de muestra de Visual Studio, probablemente ya esté escondido en algún lugar de su disco duro.

+0

Ayudar con el árbol de expresiones para: DummyCol.Where (DummyItem => Convert.ToString (DummyItem.Serialno) .StartsWith ("2008")) –

+0

Agregué el segundo árbol de expresiones al código de ejemplo. – sisve

Cuestiones relacionadas