从表达式树中提取谓词

时间:2014-02-27 16:40:59

标签: c# linq expression-trees

HI有Linq查询

    services.Get<Container>().Where(x => x.Approval.Status == "APPROVED")

如何获得Approval.Status ==“APPROVED”

1 个答案:

答案 0 :(得分:2)

这比看起来要难得多。如果Where方法属于您,并且您的参数类型为Expression<Func<T, bool>>,则可以使谓词像myExpression.Body一样简单。

但是你所能得到的只是一个Expression,它可以是任何东西。您自己的示例是参数表达式的成员表达式的成员表达式的二进制表达式,该表达式与常量表达式进行比较。如果你打电话给方法会怎么样?像这样:

services.Get<Container>().Where(x => x.IsStatus("APPROVED"))

这将导致一个完全不同的表达式,它需要与您的示例完全不同的处理。即使您不允许方法调用,您仍然需要解析表达式以确认它不是一个。

因为表达式不是特定于语言的,所以ToString()可能非常不可预测。这就像IL和C#之间的中途。

您可以做的就是构建一个表达式解析器,这是一项非常艰巨的任务。如果这是您想要深入研究的内容,请查看ExpressionVisitor。它提供了一种方便的方法来根据需要迭代和解析Expression。