【问题标题】:Implementing a custom LINQ-to-X provider实现自定义 LINQ-to-X 提供程序
【发布时间】: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) 来检查我无法使用的表达式,所以我显然走错了路。

【问题讨论】:

  • 正如您所问的,这个问题非常广泛。您对如何导航表达式树有疑问吗?如果你用谷歌搜索,周围有很多教程,但看起来你已经弄清楚了一些。您是否特别询问如何检查节点的LeftRight 属性?你具体有什么困难?
  • @StriplingWarrior 诚实的答案是,我不知道——这是一个未知的未知数。几年来,我一直在使用查询的创建方面,并且认为我已经知道它们是如何工作的。当试图将查询转换为另一方有用的东西时,我遇到的第一个问题是BinaryExpression。鉴于存在范围界定问题,这表明我采用了错误的方法,所以我真的希望能介绍一下作为一个整体评估表达式的主题。
  • 由于这个问题含糊不清,我将投票关闭它。希望您能够阅读其中的一些教程并了解您不知道的内容。当您可以将您的困难缩小到一个可以回答的问题时,希望我们可以为您提供更多帮助。
  • 如果您在 Google 上搜索“自定义 linq 提供程序教程”,stackoverflow.com/questions/252751 在结果中的排名靠前,因为除了这个简单问题之外,它没有包含很多信息。这使其他人更容易快速找到他们问题的答案。结束问题(如“不是真正的问题”、“完全重复”等)的目的不是让人们停下来,而是在 StackOverflow 上保持高度的相关性。我知道还有其他更糟糕的问题尚未解决;我不会去寻找它们,但是当我找到它们时我会投票关闭它们。

标签: .net linq


【解决方案1】:

您可能想查看ExpressionVisitor 类的子类化。这提供了遍历表达式树的机制,您所拥有的所有方法都覆盖了处理每种类型节点的方法。

以下是您可能会发现有用的其他一些链接:

【讨论】:

    【解决方案2】:

    您可以尝试使用我编写的名为 LinqToAnything 的项目,您可以使用它来包装数据源以公开 IQueryable,具体取决于您的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多