使用linq对记录进行排序后,如何获得固定的行数?

时间:2019-07-11 17:06:35

标签: c# linq

我正在将ASP.NET Core与EF模型结合使用。我想按日期显示一些行,然后按时间显示,但我只想要5条记录。所关心的是实际上是在获取5条记录之前先对所有行进行排序,还是从表中获取5行然后对其进行排序。我需要的是前者,它们是要排序的,而不是从linq中已经排序的列表中提取5条记录。

我尝试过:

Model.Meetings.OrderBy(x => x.Date).ThenBy(x => x.Time).Take(5)

还有

Model.Meetings.Take(5).OrderBy(x => x.Date.ThenBy(x => x.Time)

第一个似乎没有显示或实际上什么也不返回。

第二个有效并显示5条记录,但是那5条记录呢?

@foreach (var meeting in Model.Meetings.Take(5).OrderBy(x => x.Date).ThenBy(x => x.Time))
{
    @if (meeting.Date > DateTime.Today)
    { 
        <tr>
            <td>@meeting.Name</td>
            <td>@meeting.Date</td>
            <td>@meeting.Time</td>
        </tr>
    }
}

我希望按日期,按时间顺序显示5条记录,但是在显示它们之前先对记录进行排序。

以下是示例数据集:

编号日期日期为有效位置ThisEventId时间

1 2019-07-19 00:00:00.0000000星期五1校园2 09:15:00.0000000

2 2019-07-19 00:00:00.0000000星期五1校园3 09:00:00.0000000

3 2019-07-19 00:00:00.0000000星期五1校园4 09:30:00.0000000

4 2019-07-19 00:00:00.0000000星期五1校园5 10:30:00.0000000

5 2019-07-19 00:00:00.0000000星期五1校园6 11:00:00.0000000

6 2019-07-19 00:00:00.0000000星期五1校园7 11:30:00.0000000

7 2019-07-19 00:00:00.0000000星期五1校园8 13:00:00.0000000

8 2019-06-20 00:00:00.0000000星期四1校园9 08:45:00.0000000

9 2019-06-20 00:00:00.0000000星期四1校园10 09:00:00.0000000

10 2019-06-20 00:00:00.0000000星期四1校园11 09:30:00.0000000

1 个答案:

答案 0 :(得分:0)

编辑:OP在以下评论中进行了澄清后,请参见发布结尾以获取更新的答案。

我相信@RufusL的评论是正确的,您想使用OrderByDescending。要提供此问题的解决方案,请参见下面的代码。这将首先按日期排序,然后按时间排序,并获取前5个项目。

@{ var meetings = Model.Meetings.OrderByDescending(x => x.Date).ThenByDescending(x => x.Time).Take(5) }
@foreach (var meeting in meetings) {
    @if (meeting.Date > DateTime.Today) {
        <tr>
            <td>@meeting.Name</td>
            <td>@meeting.Date</td>
            <td>@meeting.Time</td>
        </tr>
    }
}

编辑:

要获取将来的日期,仅使用>不起作用。您将要使用.CompareTo方法。第一步是通过下面的表达式对将来的时间进行过滤。 This question地址与C#中的DateTime比较。关于.CompareTo方法,另请参见the Microsoft docs

meetings.Where(x => x.Date.CompareTo(DateTime.Today) > 0)

然后OrderBy将使用与今天最接近的日期对它们进行排序,因此整个表达式变为

meetings.Where(x => x.Date.CompareTo(DateTime.Today) > 0).OrderBy(x => x.Date).ThenBy(x => x.Time)

下面是一个完整的示例,其中List<DateTime>代表您的Model.Meetings

class Meeting {
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public TimeSpan Time { get; set; }
}

List<Meeting> allMeetings = new List<Meeting>() {
    new Meeting{ Name = "1", Date = new DateTime(2019, 07, 7), Time = new TimeSpan(9, 15, 00) },
    new Meeting{ Name = "2", Date = new DateTime(2019, 07, 17), Time = new TimeSpan(9, 15, 00) },
    new Meeting{ Name = "3", Date = new DateTime(2019, 07, 17), Time = new TimeSpan(11, 15, 00) },
    new Meeting{ Name = "4", Date = new DateTime(2019, 07, 11), Time = new TimeSpan(11, 15, 00) },
    new Meeting{ Name = "5", Date = new DateTime(2019, 07, 12), Time = new TimeSpan(11, 15, 00) },
    new Meeting{ Name = "6", Date = new DateTime(2019, 07, 13), Time = new TimeSpan(11, 15, 00) },
    new Meeting{ Name = "7", Date = new DateTime(2019, 07, 14), Time = new TimeSpan(11, 15, 00) },
};

IEnumerable<Meeting> meetings = allMeetings.Where(x => x.Date.CompareTo(DateTime.Today) > 0).OrderBy(x => x.Date).ThenBy(x => x.Time);
foreach (Meeting meeting in meetings) {
    Console.WriteLine($"{meeting.Name}\t{meeting.Date}\t{meeting.Time}");
}

因为今天是7月11日,所以我收到的输出在下面,按所需顺序排列。

  

5 7/12/2019 12:00:00 AM 11:15:00

     

6 7/13/2019 12:00:00 AM 11:15:00

     

7 7/14/2019 12:00:00 AM 11:15:00

     

2 7/17/2019 12:00:00 AM 09:15:00

     

3 7/17/2019 12:00:00 AM 11:15:00