2010-09-08 32 views
5

Sto tentando di creare una query dinamica con alberi di espressione in LINQ per rappresentare la seguente queryCreare un albero di espressione in C#

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

ho cercato di creare in questo 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")); 

Sto ottenendo un errore durante il runtime. In che modo la query sopra può essere costruita utilizzando gli alberi di espressione?

+0

Perché non ci dici che errore stai ricevendo? – LukeH

risposta

7

Il modo più semplice sarebbe quella di dichiarare il proprio come un Expression<Func<...>>

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

Ma se si vuole costruire utilizzando diverse espressioni ...

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

maggior parte delle persone [che ho parlato con] chi entra nel dominio degli alberi di espressione di solito sono soddisfatti della funzionalità System.Linq.Dynamic. (Che può essere abusato in molti modi diversi.) Questo frammento di codice di pura suggestione è una parte del codice di esempio di Visual Studio, probabilmente nascosto da qualche parte sul tuo hard disk già.

+0

Si prega di aiutare con albero delle espressioni per: DummyCol.Where (DummyItem => Convert.ToString (DummyItem.Serialno) .StartsWith ("2008")) –

+0

Ho aggiunto il secondo albero di espressioni al codice di esempio. – sisve

Problemi correlati