What instantiate-able types implementing IQueryable<T> are available in .Net 4.0?
在.NET 4.0的C_on环境中,是否有实现IQueryable的内置对象?
IQueryable对象由可查询的提供程序(如linq to sql、linq to entities/entity framework等)生成。实际上,在基本的.NET框架中,没有任何东西可以用new进行实例化来实现iQuery。
IQueryable是一个设计用于创建可查询提供者的接口,它允许通过构建可解析表达式树,在外部数据存储中利用LINQ库。从本质上讲,查询表需要一个上下文——关于您所查询内容的信息。使用new创建任何iqueryable类型,不管它是否可能,都不会让您走得很远。
也就是说,任何IEnumerable都可以使用AsQueryable()扩展方法转换成IQueryable。这在后台创建了一个表面上相似但功能上非常不同的构造,就像对一个普通的IEnumerable对象使用linq方法一样。这可能是您在不设置实际的IQueryable提供程序的情况下可以访问的最丰富的查询源。这种转换对于单元测试基于LINQ的算法非常有用,因为您不需要实际的数据存储,只需要一个可以模拟它的内存数据列表。
- 谢谢。您描述的场景(单元测试)基本上就是我正在做的。你知道关于你提到的构造差异的任何好的文档吗?我很想了解更多关于使用AsQueryable()扩展方法时对象的不同之处。
- 这是非常不同的。iQuery方法不是由IEnumerable Linq方法生成的迭代器对象链,而是向表达式树添加节点。这个树本身并不像迭代器那样可以作为代码执行。但是,它是可序列化、可解析的,因此您可以确定查询的结构,并将其转换为其他语言(如SQL)的查询。
- 看看这个问题和所有相关链接:stackoverflow.com/questions/252785/&hellip;
- 我想你在这里帮我学到了两件事-stackoverflow.com/questions/9010384/&hellip;。当使用"linq to objects"时,我使用的是迭代器链,而使用l2sql或l2e时,表达式树最终会转换为可查询提供程序知道的SQL或其他查询语言?我理解得体吗?
- 是的,你有基本的概念。继续阅读;两者之间有一些重要的区别,但基本要点是,虽然两者都允许对所构建的任何结构进行"懒惰"的评估,但IEnumerable Linq用于处理普通的内存对象集合,而iQueryable Linq用于与"内存不足"的数据源对话。
EntityCollection和EnumerableQuery一样。
我想这两个都不会让你有任何收获。为了提供帮助,我们需要知道您真正想要解决的是什么。如果要编写LINQ提供程序,请阅读以下内容:http://msdn.microsoft.com/en-us/library/bb546158.aspx。
他们建议编写自己的实现。
- 谢谢您。很抱歉在最初的帖子中出现了混乱;我不想寻求代码方面的帮助,只是学习新的C对象。
- 我看不到EntityCollection实现iQueryableAnywhere…
- @Andreytch,EntityCollection没有。DbQuery和DbSet等都可以,但我不确定什么是公开的可实例化的。
你的问题有点奇怪…但我相信,如果您查看Reflector中的接口,它将为您提供加载的程序集中的实现者列表。
作为免责声明,我没有使用Reflector,因为它是付费的,所以我可能错了。