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])