c# - 在 C# 中创建一个表达式树

标签 c# linq expression-trees

我正在尝试使用 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<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 示例代码的一部分,可能已经隐藏在您的硬盘驱动器上的某个地方。

关于c# - 在 C# 中创建一个表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666906/

相关文章:

c# - 将对象传递给 COM 方法

c# - 需要我已经拥有的 Objective-C 版本的 Java 加密和 Base 64 编码

c# - 我可以为 XAML 中的属性选择多个值吗?

c# - 使用哈希表的不同值

c# - 如何使用表达式树编写此嵌套查询?

c# - 以编程方式创建 SQLite 表

linq - 为什么这个 Linq 无法编译?

math - 我应该在数学游戏中使用表达式解析器吗?

c# - 构建表达式树

c# - 简单的 SELECT WHERE LINQ 查询列表