【问题标题】:What's the difference between IOrderedQueryable and IQueryable?IOrderedQueryable 和 IQueryable 有什么区别?
【发布时间】:2010-08-17 11:26:19
【问题描述】:

我有这个:

    var points = from p in ContextDB.Points
                 orderby p.PointInTime descending
                 where p.InstanceID == instanceId
                 && p.ParentPointID == null
                 && p.PointTypeID == currentPointTypeID
                 select p;

还有这个:

    var points = from p in ContextDB.Points
                 where p.InstanceID == instanceId
                 && p.ParentPointID == null
                 && p.PointTypeID == currentPointTypeID
                 orderby p.PointInTime descending
                 select p;

虽然我了解两者的用法(稍后会产生错误),但我不明白它们有何不同。

我确实在 STO 的其他地方看到过类似的问题,但恐怕我还没有得到这个问题的答案。

【问题讨论】:

  • 你能显示显示错误的代码吗?

标签: .net iqueryable


【解决方案1】:

实现IOrderedQueryable<T> 的类型包含额外的状态来保存有关排序的信息。

IQueryable<T> 通常表示稍后将执行的操作(并且可能在不同的计算机上使用完全不同的语言,例如使用 LINQ to SQL)。需要一个单独的接口,因为下一个操作可能是另一个排序,这需要与第一个不同的处理(按列 A 排序,然后 B 需要定义两个 LINQ 运算符,但系统需要确保每个键都有助于整体排序)。

【讨论】:

  • 我不确定这是否正确,因为 IOrderedQueryable 接口只是一个标记接口(请参阅msdn.microsoft.com/en-us/library/bb340178.aspx)。所以我猜它只包含列表排序的信息,而没有关于排序本身的其他信息。
  • @leo:特定的 LINQ 提供程序是否将其用作标记(并允许随后的 ThenBy/ThenByDescending 调用)或者返回的对象是否真的不同是实现细节。在 LINQ to Objects 中,它是一种不同的类型(尝试自己实现),但显然其他提供程序(例如生成 SQL)将有非常不同的方法。总结:它为提供者提供了为排序运算符采用不同实现的范围,但并不要求它们这样做。
【解决方案2】:

很容易看出您是否将查询理解转换为其相应的 Linq 扩展方法。 OrderBy() 的返回类型是 IOrderedEnumerable。 Where() 返回 IEnumerable。您的第一个表达式所做的是首先对 all 点进行排序,然后仅选择与 where 子句匹配的点。最后应用的操作是 Where,因此表达式类型是 IEnumerable.

哪个更高效很大程度上取决于您使用的 Linq 提供程序。我的钱是最后排序的。尽管我猜想提供商足够聪明,可以按最佳顺序订购操作。你可能想检查一下。

【讨论】:

    【解决方案3】:

    IOrderedQueryable 是产生特定顺序的查询结果,而 IQueryable 具有不确定顺序的元素。

    【讨论】:

    • 我认为第一个代码示例不会订购任何东西是否正确?如果是这样,在where 之前使用orderby 有什么意义?
    • @Matt-W :我们必须查看表达式树以确定每个查询的处理具体程度。我怀疑这是第一个为您生成错误的查询。它不是第一个或唯一一个你可以愉快地编写和编译而不会在执行期间失败的 Linq 查询,这就是 Linq 的本质。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多