我有这个查询数据库的代码
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
答案 0 :(得分:4)
颠倒查询的顺序。基本思路是颠倒整个查询的顺序,获取前三个元素,然后再次反转顺序,将它们按正确的顺序放回:
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(但我猜你不是),你可以使用来自morelinq的TakeLast
。
答案 1 :(得分:2)
您不会在此处引入任何订单,因此您目前可以获得任何 3个结果,而这些结果碰巧不是您想要的结果。建立订单:
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Name descending
select m).Take(3).ToList();
使用orderby
您可以指定升序或降序来反转顺序,这将导致使用Take
返回第一个或最后3个元素。
答案 2 :(得分:1)
您可以使用orderby
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Id descending
select m).Take(3).ToList();
或者,正如@MarkByers所说,只需使用Reverse
答案 3 :(得分:0)
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()
调用后调用