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