【发布时间】:2012-08-29 15:20:26
【问题描述】:
我有一个搜索工具,它采用复杂的搜索字符串(实际上是 JSON 中的 n 级对象图)并返回一些结果。我想通过类似 LINQ 的机制向其他(内部)开发人员公开该功能。
假设每个结果都由一个类Result定义
我可以创建如下所示的方法:
Function Search(Expression As Linq.Expression(Of System.Func(Of Result, Boolean))) As IEnumerable(Of Result)
我不清楚的是如何遍历 Expression 参数并提取实际标准,然后我可以将其形成对象图以运行我的查询。
有人可以指点我如何实现这一点的教程/示例吗?
对于一些背景知识,我已经设法深入研究表达式以获得递归结构,并且能够检查 lambda 表达式的 .Body,但是当我想处理 Left 时和Right 类型为ExpressionType.Or 的节点的属性,我遇到了问题。调试器正在使用 Friend 范围的类 (BinaryExpressionProxy) 来检查我无法使用的表达式,所以我显然走错了路。
【问题讨论】:
-
正如您所问的,这个问题非常广泛。您对如何导航表达式树有疑问吗?如果你用谷歌搜索,周围有很多教程,但看起来你已经弄清楚了一些。您是否特别询问如何检查节点的
Left和Right属性?你具体有什么困难? -
@StriplingWarrior 诚实的答案是,我不知道——这是一个未知的未知数。几年来,我一直在使用查询的创建方面,并且认为我已经知道它们是如何工作的。当试图将查询转换为另一方有用的东西时,我遇到的第一个问题是
BinaryExpression。鉴于存在范围界定问题,这表明我采用了错误的方法,所以我真的希望能介绍一下作为一个整体评估表达式的主题。 -
由于这个问题含糊不清,我将投票关闭它。希望您能够阅读其中的一些教程并了解您不知道的内容。当您可以将您的困难缩小到一个可以回答的问题时,希望我们可以为您提供更多帮助。
-
如果您在 Google 上搜索“自定义 linq 提供程序教程”,stackoverflow.com/questions/252751 在结果中的排名靠前,因为除了这个简单问题之外,它没有包含很多信息。这使其他人更容易快速找到他们问题的答案。结束问题(如“不是真正的问题”、“完全重复”等)的目的不是让人们停下来,而是在 StackOverflow 上保持高度的相关性。我知道还有其他更糟糕的问题尚未解决;我不会去寻找它们,但是当我找到它们时我会投票关闭它们。