在c#中创建表达式树

我试图在LINQ中使用表达式树创建一个动态查询来表示以下查询

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

我在运行时遇到错误。 如何使用表达式树最好地构建上述查询?

最简单的方法是将其声明为Expression>

 public static class Program { public static void Main() { Expression> 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.Dynamicfunction感到满意。 (这可以被滥用到很多不同的方式。)这个纯粹的awesomeness代码片段是Visual Studio示例代码的一部分,可能已经隐藏在你的硬盘驱动器的某个地方。