.Net 4.0 中都有哪些实现 IQueryable<T> 的可实例化类型?
Posted
技术标签:
【中文标题】.Net 4.0 中都有哪些实现 IQueryable<T> 的可实例化类型?【英文标题】:What instantiate-able types implementing IQueryable<T> are available in .Net 4.0?.Net 4.0 中有哪些实现 IQueryable<T> 的可实例化类型? 【发布时间】:2012-02-28 12:09:34 【问题描述】:在 .Net 4.0 上的 C# 上下文中,是否有任何实现 IQueryable<T>
的内置对象?
【问题讨论】:
【参考方案1】:IQueryable
对象由可查询提供程序(例如 LINQ to SQL、LINQ to Entities/Entity Framework 等)生成。在基本的 .NET Framework 中,您几乎无法使用 new
实例化任何东西来实现 IQueryable。
IQueryable
是一个设计用于创建可查询提供程序的接口,它允许通过构建可解析的表达式树来针对外部数据存储利用 LINQ 库。从本质上讲,Queryables 需要一个上下文 - 关于您正在查询的确切内容的信息。使用 new
创建任何 IQueryable 类型,无论是否可能,都不会让您走得太远。
话虽如此,任何IEnumerable
都可以通过使用AsQueryable()
扩展方法转换为IQueryable
。这在幕后创建了一个表面上相似但功能上非常不同的构造,就像在对普通的IEnumerable
对象使用 LINQ 方法时一样。这可能是您无需设置实际的 IQueryable 提供程序即可访问的最丰富的可查询源。这种转换对于基于 LINQ 的算法的单元测试非常有用,因为您不需要实际的数据存储,只需一个可以模仿它的内存数据列表。
【讨论】:
谢谢。您描述的场景(单元测试)几乎就是我正在做的事情。你知道关于你提到的构造差异的任何好的文档吗?我很想了解更多关于使用AsQueryable()
扩展方法时对象的不同之处。
这是非常不同的。 IQueryable 方法将节点添加到表达式树,而不是由 IEnumerable Linq 方法生成的 Iterator 对象链。这棵树本身并不能像迭代器那样作为代码执行。但是,它是可序列化的、可解析的等,因此您可以确定查询的结构并将其转换为另一种语言(如 SQL)的查询。
看看这个问题和所有相关链接:***.com/questions/252785/…
我认为你帮助我在这里学到了两件事 - ***.com/questions/9010384/…。当使用“linq to objects”时,我正在使用一系列迭代器,而使用 L2Sql 或 L2E 是表达式树最终转换为 SQL 或可查询提供者知道的其他查询语言?我理解得体吗?
是的,你有基本的概念。继续阅读;两者之间存在重要差异,但基本要点是,虽然两者都允许对您构建的任何构造进行“惰性”评估,但 IEnumerable Linq 用于处理普通的内存对象集合,而 IQueryable Linq 用于交谈到“内存不足”的数据源。【参考方案2】:
EntityCollection 和EnumerableQuery 一样。
并不是说我认为这些中的任何一个都会让你到达任何地方。为了提供帮助,我们需要知道您真正想要解决的问题。如果您正在编写 LINQ 提供程序,您应该阅读以下内容:http://msdn.microsoft.com/en-us/library/bb546158.aspx。
他们建议编写您自己的实现。
【讨论】:
谢谢。很抱歉在最初的帖子中造成混乱;我不是在寻找代码方面的帮助,只是学习新的 C# 对象来玩。 @AndreyTch,EntityCollection 没有。DbQuery<T>
,DbSet<T>
等可以,但我不确定什么是可公开实例化的。【参考方案3】:
嗯,你的问题有点奇怪......但我相信如果你查看Reflector 中的接口,它会给你一个加载程序集中的实现者列表。 p>
作为免责声明,我没有使用 Reflector,因为它是付费游戏,所以我可能错了。
【讨论】:
以上是关于.Net 4.0 中都有哪些实现 IQueryable<T> 的可实例化类型?的主要内容,如果未能解决你的问题,请参考以下文章