【问题标题】:LINQ passthrough provider?LINQ 直通提供程序?
【发布时间】:2013-06-07 01:02:36
【问题描述】:

我已经实现了简单的IQueryableIQueryProvider 类,用于收集有关LINQ 表达式树的统计数据。这部分工作正常。接下来,我想将表达式树传递给默认的 LINQ-to-Objects 提供程序进行评估,因为我不需要以任何不同的方式执行它。换句话说,我希望我的提供者收集统计信息作为副作用,将查询传递给默认的 LINQ 实现。

但是,我很难获得默认提供程序的句柄。我认为我可以简单地保存对原始 IEnumerable 集合的引用,然后返回默认提供程序(来自我的自定义 IQueryable),例如:

IQueryProvider IQueryable.Provider
{
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}

但这不能正常工作。代码最终会抛出一个StackOverflowException。我认为正在发生的事情(从调试模式下的单步执行中收集)是 LINQ 运行时从上述方法中获取提供程序,然后从我的自定义 IQueryable 中获取表达式树,然后它注意到顶级表达式是我的自定义IQueryable。所以它重新开始这个过程,试图找到合适的提供者。它无休止地这样做,直到发生堆栈溢出。

现在,我唯一能想到的就是想出另一个访问者来生成另一个表达式树,其中删除了自定义 IQueryable 节点,以便 LINQ 运行时调用默认提供程序。这是相当多的工作,因为我需要访问每一片叶子以确保没有嵌套的Call 表达式再次调用我的自定义IQueryable。有没有更简单的方法?

感谢您的帮助。

【问题讨论】:

  • 那么您是否在提供者获取自身的地方进行了一些递归?
  • 没错。这令人费解,因为我相信我应该得到原始提供者的参考。

标签: c# linq linq-to-objects custom-linq-providers


【解决方案1】:

事实证明,这里真正的问题正是Pass LINQ expression to another QueryProvider 中描述的问题。

【讨论】:

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