[英]Linq - how to get top records?
我有查詢數據庫的代碼
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
select m).Take(3).ToList();
上面的代碼為我提供了前3個結果,如何更改為后3個?
意思是如果我在數據庫中有100行,我想得到98、99、100而不是1、2、3
顛倒查詢順序。 基本思想是顛倒整個查詢的順序,獲取前三個元素,然后再次顛倒順序以將它們放回正確的順序:
var query = from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
select m;
var lastItems = query.OrderByDescending(x => x.ID).Take(3).Reverse().ToList();
PS:如果您使用的是Linq to Objects(但我想不是),則可以使用TakeLast
的TakeLast。
您在這里沒有引入任何命令,所以您目前得到任何 3個結果,其偶然不正好是你想要的人。 建立訂單:
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Name descending
select m).Take(3).ToList();
使用orderby
可以指定升序或降序來反轉順序,這將導致使用Take
返回前三個元素。
您可以使用orderby
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Id descending
select m).Take(3).ToList();
或者,如@MarkByers所說,只需使用Reverse
var buildInfoList = from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
select m;
var count = buildInfoList.Count();
var list = buildInfoList.Skip(count < 3 ? count - 3 : 0).Take(3).ToList();
編輯:為什么這種解決方案不同於其他解決方案? 但這並不意味着是最好的。
首先,OP聲明查詢是通過數據庫進行的,並且由於查詢使用Take而不指定順序,因此我想這與Linq To Sql有關。
該解決方案實際上並不是最好的解決方案,因為它會執行兩個查詢,一個查詢計數,另一個查詢獲取項目。 此解決方案僅使用SQL來獲取最后3個項目,並且不對對象進行排序。
在使用LINQ Pad進行測試時,我注意到,當未指定任何順序時,LINQ to SQL會在所有列上生成順序
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[id], [t0].[A], [t0].[B], [t0].[C])
觀測值:
Reverse
方法未轉換,因此最好在ToList()
調用之后調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.