簡體   English   中英

Linq-如何獲得最高記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM