如何通过linq获得5个最高值

时间:2013-11-10 12:02:15

标签: c# asp.net sql linq

我有一个书籍数据库。

ID                    TimesRead
1                     45
2                     12
3                     84
4                     1
5                     17
6                     65
7                     4
8                     98
9                     42
10                    14

如何通过linq获得5本最多的阅读书籍?

在这种情况下,它将是id= 8,3,6,1,9

3 个答案:

答案 0 :(得分:1)

from m in MyTable
orderby TimesRead descending
take 5
select m

或者

Mytable.OrderByDesc(x => x.TimesRead).take(5);

答案 1 :(得分:1)

用户ta.speot.is发表了一个非常明智的评论:关系怎么样?或者,如果书#10也有42个读数(如9),该怎么办?放弃联盟是不公平的,不是吗?如果所有书籍都具有相同的读取量,那么最极端的形式是什么?

让我们假设它是您感兴趣的五个读取。然后您应该按TimesRead分组并报告五个最高的组及其书籍(任意数字):

var readGroups = from b in books
                 group b by b.TimesRead into readgroup
                 select new 
                     { 
                         TimesRead = readgroup.Key, 
                         Books = string.Join(", ", readgroup.Select(b => b.Id))
                     };
var highFive = readGroups.Take(5);

这将为您提供类似

的输出
98  8
84  3
65  6
45  1
42  9

但如果10也有42个读数:

98  8
84  3
65  6
45  1
42  9, 10

如果所有人都有相同的#read:

42  1, 2, 3, 4, 5, 6, 7, 8, 9, 10

答案 2 :(得分:0)

对从DB获取的IEnumerable / IQueryable结果使用OrderByDescending()和Take()扩展方法,然后使用Select()仅获取所需的字段