繁体   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