2011-03-27 63 views
0

我需要對實際數據庫中的查詢結果進行排序(因此,當我得到一些結果時,我不必每次對它進行排序)。我可以用linq做這個嗎?用linq排序數據庫中的字段

+0

你的意思是你想讓它們在數據庫中「預先排序」? – 2011-03-27 13:35:57

+0

那麼你想排序由數據庫自動完成? – 2011-03-27 13:36:11

+0

@albin ..是的,我想讓他們預先排序 – Alex 2011-03-27 13:38:31

回答

2

數據庫表本質上是無序的;這不可能。

相反,您可以使用帶有ORDER BY子句的視圖,或者在您的數據訪問類中創建一個返回IOrderedQueryable<T>的屬性。

+0

啊謝謝!不知道這個! – Alex 2011-03-27 13:42:35

1

創建適當的索引,創建正確的查詢,一切都會好起來的。

即使數據是「預分類」 - dbms也不知道這一點,它會對數據進行排序(即使它已經被排序)。並且不能保證在執行查詢數據庫時將順序讀取數據。

1

SQL中的表沒有被排序的概念。您可以得到最接近的是在SQL服務器上創建視圖並使用LINQ2SQL查詢該視圖。

有了合適的索引,速度會很好,尤其是在查詢時你不需要記住排序。

2

我在這裏稍微不同意(暫時)與人們說表沒有排序。通常它們是,如果你在表上有聚集索引(在具有這種概念的數據庫中),或者你已經在索引上聚集了一個表(在具有這種不同但相關概念的數據庫中),那麼「無序」選擇將會按照該順序檢索結果。

但是,我的分歧只是暫時的,因爲他們所說的是事情的真相。事實上,一個無序的select按順序獲得結果純粹是因爲它將成爲數據庫的最快命令。值得注意的是,數據庫將足夠聰明,如果你有一個按id排序的表,並且你要求它通過id來選擇它們,它會知道它不必重新排序它們。

因此,理想情況下應該對錶中最經常選擇的列或列進行聚類(但要注意,這包括在查詢中將一個表連接到另一個表時使用的內部選擇,所以通常主鍵是最好的集羣,即使它從不構成查詢排序的基礎)。

需要特定順序的查詢應該總是明確地詢問該順序,即使由於無序版本以相同順序結束而看起來很浪費 - 您不希望在最有效的方式上進行存儲數據庫採取行動的方式會很晚,而且你不會因爲明確而失去任何東西。

LINQ是否對數據庫進行排序取決於它獲取結果的方式。假設MyTable是某種類型的System.Data.Linq.Table<TEntity>的變量TEntity。然後:

from m in MyTable orderby m.Id select new {m.Id, m.Name} 

將做排序的數據庫,把它變成像

SELECT Id, Name FROM MyTable ORDER BY MyTable.Id 

,然後發出的每個對象作爲流從數據庫的用武之地。但是:

from m in MyTable.AsEnumerable() orderby m.ID select new {m.Id, m.Name} 

會首先做等價的:

SELECT * FROM MyTable 

然後在內存中進行訂購,然後創建匿名對象,因爲他們則變得可用(與其他明顯的缺點以來,訂貨會現在即使結果以相同的順序進行也是如此,因爲數據庫可能不會使用相同的先驗知識來跳過排序,並且某些算法對已排序的數據進行排序具有更差的性能)。

在這些情況下,前者明顯優於後者,但這是一個相當簡單的情況。在更復雜的情況下采取後一種形式既是必要的,也是至少是理想的,並且在處理更復雜的情況時,也可能意外地做出不希望的後一種情況的等價物。值得在程序員分析部分保持良好的觀點,即Linq何時處理數據庫中的內容以及何時處理內存。通過SQL Profiler和/或在LinqPad中測試查詢,檢查爲更復雜的查詢生成的SQL通常是一個好主意。

相關問題