【问题标题】: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&lt;T&gt; 的内置对象?

【问题讨论】:

    标签: linq c#-4.0 types interface iqueryable


    【解决方案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)的查询。
    • 看看这个问题和所有相关链接:stackoverflow.com/questions/252785/…
    • 我认为你帮助我在这里学到了两件事 - stackoverflow.com/questions/9010384/…。当使用“linq to objects”时,我正在使用一系列迭代器,而使用 L2Sql 或 L2E 是表达式树最终转换为 SQL 或可查询提供者知道的其他查询语言?我理解得体吗?
    • 是的,你有基本的概念。继续阅读;两者之间存在重要差异,但基本要点是,虽然两者都允许对您构建的任何构造进行“惰性”评估,但 IEnumerable Linq 用于处理普通的内存对象集合,而 IQueryable Linq 用于交谈到“内存不足”的数据源。
    【解决方案2】:

    EntityCollectionEnumerableQuery 一样。

    并不是说我认为这些中的任何一个都会让你到达任何地方。为了提供帮助,我们需要知道您真正想要解决的问题。如果您正在编写 LINQ 提供程序,您应该阅读以下内容:http://msdn.microsoft.com/en-us/library/bb546158.aspx

    他们建议编写您自己的实现。

    【讨论】:

    • 谢谢。很抱歉在最初的帖子中造成混乱;我不是在寻找代码方面的帮助,只是学习新的 C# 对象来玩。
    • @AndreyTch,EntityCollection 没有。DbQuery&lt;T&gt;DbSet&lt;T&gt; 等可以,但我不确定什么是可公开实例化的。
    【解决方案3】:

    嗯,你的问题有点奇怪......但我相信如果你查看Reflector 中的接口,它会给你一个加载程序集中的实现者列表。 p>

    作为免责声明,我没有使用 Reflector,因为它是付费游戏,所以我可能错了。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2012-01-17
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多