2010-09-08 91 views
5

我試圖使用表達式樹在LINQ代表下面的查詢來創建一個動態查詢C#創建一個表達式樹

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

我試圖像這樣創建:

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

我在運行時遇到錯誤。上述查詢如何最好的使用表達式樹來構建?

+0

你爲什麼不告訴我們你得到了什麼錯誤? – LukeH 2010-09-08 11:31:32

回答

7

最簡單的方法是隻宣佈它作爲一個Expression<Func<...>>

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

但是,如果你想建造它使用不同的表情......

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

大多數人[我已經談到]誰輸入表達式樹的域通常滿足System.Linq.Dynamic功能。 (這可以被濫用到許多不同的方式。)這個純粹迷人的代碼片段是Visual Studio示例代碼的一部分,可能已經隱藏在硬盤上的某個地方。

+0

請爲表達式樹提供幫助:DummyCol.Where(DummyItem => Convert.ToString(DummyItem.Serialno).StartsWith(「2008」)) – 2010-09-08 13:50:41

+0

我已將第二個表達式樹添加到示例代碼中。 – sisve 2010-09-09 13:33:08