C# Linq-如何获得顶级记录?
我有一个查询数据库的代码C# Linq-如何获得顶级记录?,c#,linq,C#,Linq,我有一个查询数据库的代码 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 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对象(但我想您没有),您可以使用from morelinq。您可以使用orderby
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Id descending
select m).Take(3).ToList();
或者,正如@MarkByers所说,只需使用
反向
您在这里没有引入任何顺序,因此您当前可以得到任意3个结果,这些结果碰巧不是您想要的结果。建立秩序:
var buildInfoList = (from m in context.BuildInfoes
where m.ManagerInfoGuid == managerGuid
orderby m.Name descending
select m).Take(3).ToList();
使用orderby
可以指定升序或降序以反转顺序,这将导致使用Take
返回第一个或最后3个元素
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();
注意事项:
Reverse
方法没有翻译,因此在调用ToList()
call使用orderby
将它们按相反的顺序放在第一位是很好的。Reverse不需要处理内存中的对象吗?我不认为它可以转换成DB调用,不像,比方说,顺序相反的orderby;如果指定了orderby,那么它将反转
更改该顺序,或者它将对查询求值并反转它?@Servy:我尝试使用Linq to SQL,但那里不支持反转,因此您必须首先将所有结果存储到内存中。真糟糕(我会更新我的答案。我绝对欣赏这种解决方案。由于根本没有指定订单,这可能会导致不一致的结果,因此在某个地方定义订单是一件好事。此外,(这样人们就能理解您的注释所指的内容)…如果你只使用一个反转
,你的结果将是100
,99
,98
。这是第二个保持原始顺序的反转。学究气,别向我开枪;-)他说他想得到98
<代码>99,100
,这意味着按名称
排序可能会导致问题。他可能需要按Id
排序……是的,你可能是对的,因为OP没有发布任何类定义,我只是介绍了一些示例顺序,但是Id
是一个更好的候选者。嗯,有趣的解决方案。在仅仅定义订单的基础上,这种方法有什么必要呢?@ChaseFlorell我补充道
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[id], [t0].[A], [t0].[B], [t0].[C])