我已经实现了简单的
然而,我很难获取默认提供程序的句柄。我认为我可以简单地保存对原始
但这个代码不正确地工作。最终会抛出StackOverflowException异常。通过单步调试,我认为正在发生的是LINQ运行时从上述方法获取提供程序,然后从我的自定义IQueryable获取表达式树,然后它注意到顶级表达式是我的自定义IQueryable。所以它开始重新启动过程,尝试找到适当的提供程序。直到发生堆栈溢出。
IQueryable
和IQueryProvider
类,可以收集关于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。是否有更简单的方法?
感谢您的帮助。