数据库/linq查询中的筛选和排序操作是可交换的吗?
对于任意对象集合,以下两个LINQ表达式是否总是给出相同的结果(假设LINQ提供程序相同):数据库/linq查询中的筛选和排序操作是可交换的吗?,linq,sorting,filter,Linq,Sorting,Filter,对于任意对象集合,以下两个LINQ表达式是否总是给出相同的结果(假设LINQ提供程序相同): var result=list.OrderBy(x=>x.FirstName)。其中(x=>x.Age>18) var result=list.Where(x=>x.Age>18).OrderBy(x=>x.FirstName) While指定为,而不是 换句话说,不,因为不能保证排序是稳定的,所以这两个查询不能保证为所有提供者提供相同的结果。至少,结果的顺序可能不同。它们怎么可能不返回相同的结果?这将
var result=list.OrderBy(x=>x.FirstName)。其中(x=>x.Age>18)代码>
var result=list.Where(x=>x.Age>18).OrderBy(x=>x.FirstName)代码>
换句话说,不,因为不能保证排序是稳定的,所以这两个查询不能保证为所有提供者提供相同的结果。至少,结果的顺序可能不同。它们怎么可能不返回相同的结果?这将是一个严重的错误,逻辑上应该如此。从一个查询到下一个查询,两个具有相同“FirstName”值的不同对象可能会以不同的顺序返回。如果IQueryable provider在原始问题中对这两种情况(如实体框架)都是相同的,这是否适用?@matori82实体框架还有一个复杂之处,底层SQL中的顺序一开始就不稳定。如果运行第一个查询,在表中插入新行,然后再次运行完全相同的查询,则可能无法获得相同的排序结果。排序相等的值,即使结果中未包含新行。排序为相等的值可能以另一个顺序出现。目前,EF从两个查询生成相同的sql,但这是EF特定的实现细节:)