LINQ passthrough提供商?

Dan*_*owy 6 c# linq linq-to-objects custom-linq-providers

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

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

IQueryProvider IQueryable.Provider
{
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢您的帮助.

Dan*_*owy 1

事实证明,这里真正的问题正是将 LINQ 表达式传递给另一个 QueryProvider 中描述的问题。