Linq - 如何获得最佳记录?

时间:2012-03-22 15:34:33

标签: 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

4 个答案:

答案 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()调用后调用

很好