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