IOrderedQueryable和IQueryable之间有什么区别?

时间:2010-08-17 11:26:20

标签: .net iqueryable

我有这个:

    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的其他地方看到过这样的问题,但是我没有意识到这个问题的答案是什么,我很害怕。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

很容易看出你是否将查询理解翻译成相应的Linq扩展方法。 OrderBy()的返回类型是IOrderedEnumerable&lt;&gt;。 Where()返回IEnumerable&lt;&gt ;.你的第一个表达式首先是对所有点进行排序,然后只选择与where子句匹配的那些。应用的最后一个操作是Where,因此表达式类型是IEnumerable&lt;&gt;。

哪一个更有效取决于您使用的Linq提供商。我的钱最后排序。虽然我猜测提供商足够聪明,可以按最佳顺序订购操作。你可能想检查一下。

答案 2 :(得分:0)

IOrderedQueryable导致特定订单的查询结果,IQueryable具有不确定顺序的元素。