2013-06-01 40 views
2

對於對象的任意集合,將以下兩個LINQ表達式總是產生相同的結果(因爲LINQ提供程序是一樣的):在數據庫/ linq查詢過濾和排序交換操作?

  1. var result = list.OrderBy(x => x.FirstName).Where(x => x.Age > 18);

  2. var result = list.Where(x => x.Age > 18).OrderBy(x => x.FirstName);

+0

他們怎麼會不會返回相同的結果?這將是一個嚴重的錯誤,因爲他們邏輯上應該。 – Patashu

+0

具有相同的「FirstName」值的兩個不同對象可能會以不同的順序從一個查詢返回到下一個。 –

回答

1

雖然Enumerable<T>.OrderBy()被指定爲stable sort,Queryable<T>.OrderBy()不是。

換言之,不,由於排序不能保證穩定,因此這兩個查詢不能保證給所有提供者提供相同的結果。至少,結果可能以不同的順序排列。

+0

如果IQueryable 提供程序對於原始問題中的兩種情況(例如實體框架)都相同,這是否適用? – matori82

+0

@ matori82實體框架還有一個複雜的問題,即底層SQL中的順序不穩定。如果運行第一個查詢,向表中插入新行並再次運行完全相同的查詢,則可能得不到相同的排序。如果新行不包含在result_中,則排序的值相等。按照其他順序排列的值可能會以另一種順序排列。目前,EF從兩個查詢中構建_same sql_,但這是EF特定的實現細節:) –