首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ通通提供商?

LINQ通通提供商?
EN

Stack Overflow用户
提问于 2013-06-07 01:02:36
回答 1查看 408关注 0票数 6

我实现了简单的IQueryableIQueryProvider类,它们在LINQ表达式树上收集统计数据。这部分工作很好。接下来,我想将表达式树传递给默认的提供程序进行计算,因为我不需要以任何不同的方式执行它。换句话说,我希望我的提供者收集数据作为副作用,将查询传递到默认的LINQ实现。

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

代码语言:javascript
复制
IQueryProvider IQueryable.Provider
{
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}

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

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-11 20:18:04

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16974672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档