2016-04-26 79 views
3

我想從我的數據庫中選擇5個最舊的條目。我使用以下語句:C#實體框架 - 排序和採取

dbContext.Items.Take(5).OrderBy(i => i.LastCheck).ToListAsync(); 

這裏的問題是,EF首先從表中找出前5個項目,然後對它們進行排序。所以我總是從表格中獲得5個第一項。但我想它首先對項目進行排序,然後選擇前5名的,就像當我執行SQL命令:

select top 5 * from Items order by LastCheck asc 

在這裏,我得到正確的結果。

有沒有可能在EF中做到這一點,或我必須執行查詢?

感謝

+0

先訂購物品,然後取... – Gusman

+0

只需切換'OrderBy()'和'Take()'。 – itsme86

+0

只需交換orderby的位置,並採取...... – Norgerman

回答

4

必須切換Take()OrderBy()

dbContext.Items.OrderBy(i => i.LastCheck).Take(5).ToListAsync(); 
+0

有趣。由於我訂購了2個參數(OrderBy(i => i.LastCheck)。ThenBy ...)我試圖把Take(5)放在他們兩個之間,我得到一個錯誤,但我沒有試圖把Take結束。 That's it,thanks – rimes

+0

'ThenBy()'需要'OrderBy()'提供的'IOrderedEnumerable',但不是'Take()' – fubo

+1

你可以按照如下方式編寫你的兩個順序:'dbcontext.Items.OrderBy(x = > x.LastCheck).Take(5).OrderBy(y => y.someProp)'這樣,第二個'OrderBy'只需要對剩餘的5個項目進行排序,但是當然會破壞您通過LastCheck的排序。 – derpirscher

0

想到這上面已經回答了,但: -

dbContext.Items.OrderBy(x=>x.LastCheck).Take(5).ToListAsync(); 

做拿第一,會選擇你的前5項從列表中進行排序,然後對那5個進行排序,而您想要執行的操作是將列表首先按日期順序排序,然後排在前5位。

同樣,如果你想排序方式最新首先是上面的查詢(以確保它排序)將成爲: -

dbContext.Items.OrderByDescending(x=>x.LastCheck).Take(5).ToListAsync(); 

希望這有助於!