LINQ透传提供程序?

6
我已经实现了简单的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。是否有更简单的方法?

感谢您的帮助。


那么你的代码中是否存在递归,其中提供程序正在获取自身? - gunr2171
没错。这很令人困惑,因为我认为我应该得到对原始提供程序的引用。 - Dan Barowy
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接