【问题标题】:does IQueryable<T> only get returned from the Linq to Sql or Linq to Entities classes?IQueryable<T> 是否仅从 Linq to Sql 或 Linq to Entities 类返回?
【发布时间】:2010-07-19 18:51:34
【问题描述】:

在我正在阅读“Pro Linq in C# 2010”(APress、Freeman 和 Ratz)的书中,作者指出 IQueryable 只会从 Linq to Sql 命名空间中的类返回,而不是一般的 Linq 命名空间。我对此感到惊讶,因为我认为任何最后有 Where 的东西都必须是 IQueryable。原来我错了,IEnumerable的扩展在哪里。从IQueryable&lt;T&gt; : IEnumerable&lt;T&gt; 开始,您可以在其中任何一个上添加 where 子句。

作者说的对吗?

我说的是框架类,而不是任何最终用户生成的代码。

【问题讨论】:

    标签: linq linq-to-sql linq-to-entities


    【解决方案1】:

    LINQ 有两组扩展方法 - 一组包含在 Enumerable 类中,一组包含在 Queryable 类中。

    Enumerable 用于在 IEnumerable&lt;T&gt; 上工作并使用委托作为参数的 LINQ to Objects。 Queryable 适用于需要检查和处理查询并因此使用 IQueryable&lt;T&gt; 而不是 IEnumerable&lt;T&gt; 的 LINQ 提供程序,例如 Entity Framework 或 LINQ to SQL。

    在上述两个 O/R 映射器的情况下,它们必须将查询转换为 SQL 查询。这不适用于委托(除非有人分析 IL 代码或做其他疯狂的事情),因此 Queryable 中的扩展方法使用 expression trees 作为参数而不是委托。

    除了提到的两个 O/R 映射器 WCF Data Services(以前的 ADO.NET 数据服务)还使用 IQueryable&lt;T&gt; (DataServiceQuery&lt;TElement&gt;) 并将表达式树形式的查询转换为 URL。

    【讨论】:

      【解决方案2】:

      作者误会了。任何类都可以有一个返回IQueryable&lt;T&gt;的方法。

      事实上,您确定作者遗漏了 LINQ to Entities 吗? LINQ to SQL 并未完全弃用,但 LINQ to Entities 是 Microsoft 花费时间和金钱的地方,而不是 LINQ to SQL。

      【讨论】:

      • OP 确实提到他说的是其他使用 IQueryable 的框架类,而不是用户生成的类。
      • @Justin:在那种情况下,作者弄错了。什么框架类返回这种类型?很可能只生成代码。
      • 通常IQueryable&lt;T&gt; 与生成的代码一起使用,但生成的代码通常也只是包装或聚合框架类,如ObjectContextObjectSet&lt;T&gt;DataServiceQuery&lt;T&gt;,实现或公开IQueryable&lt;T&gt;
      猜你喜欢
      • 2010-10-02
      • 2011-04-08
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多