林克-如何获得最高纪录

本文关键字:最高纪录 何获得 林克 | 更新日期: 2023-09-27 18:28:53

我有这样的代码,它查询数据库

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();

附言:如果你对对象使用Linq(但我猜你没有),你可以使用morelinq中的TakeLast

您在这里没有引入任何订单,所以您目前得到任何3个结果,而这些结果恰好不是您想要的。建立订单:

var buildInfoList = (from m in context.BuildInfoes
                     where m.ManagerInfoGuid == managerGuid
                     orderby m.Name descending
                     select m).Take(3).ToList();

使用orderby,您可以指定升序或降序来反转顺序,这将导致使用Take返回前3个或最后3个元素。

您可以使用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到SQL会在所有列上生成顺序

   SELECT ROW_NUMBER() OVER (ORDER BY [t0].[id], [t0].[A], [t0].[B], [t0].[C])

Obs.:

Reverse方法未翻译,因此最好在ToList()调用

之后调用