我有一个搜索工具,它采用复杂的搜索字符串(实际上是JSON中的n级对象图)并返回一些结果。我想通过类似LINQ的机制向其他(内部)开发人员公开这些功能。
假设每个结果都由类Result
我可以创建类似的方法:
Function Search(Expression As Linq.Expression(Of System.Func(Of Result, Boolean))) As IEnumerable(Of Result)
我不清楚的是我如何走Expression
参数并提取实际标准,然后我可以将其形成对象图以运行查询。
有人能指出我如何实现这一目标的教程/示例吗?
对于一些小背景,我设法深入挖掘表达式以获得递归结构,并且能够检查.Body
lambda表达式,但是当我想要处理时节点的Left
和Right
属性,例如类型ExpressionType.Or
,我有问题。调试器正在使用一个朋友范围的类(BinaryExpressionProxy
)来检查我无法使用的表达式,因此我明确指向了错误的路径。
答案 0 :(得分:7)
您可能希望查看ExpressionVisitor类的子类化。这提供了遍历表达式树的机制,您只需覆盖处理每种类型节点的方法。
另外,请参阅相关(可能重复)的SO问题:Where are some good tutorials on writing a custom LINQ Provider?
编辑:以下是您可能会发现有用的其他一些链接:
答案 1 :(得分:2)
您可以尝试使用我编写的名为LinqToAnything的项目,您可以根据需要使用该项目来包装数据源以显示IQueryable。