我正在使用EF模型的ASP.NET核心。我想按日期和时间显示一些行,但我只想要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条记录,以显示按日期然后按时间排序,但排序记录首先显示他们。
以下是示例数据集:
Id日期日期IsActive位置ThisEventId时间
2019-07-19 00:00:00.0000000周五1 On-校园2 09:15:00.0000000
2 2019年7月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
2019年07月19日00:00:00.0000000周五1月8日13:00:00.0000000
82019-06-20 00:00:00.0000000周四1月9日08:45:00.0000000
2019-06-20 00:00:00.0000000周四1- 10 -10 09:00:00.0000000
102019-06-20 00:00:00.0000000周四1- 11 09:30:00.0000000
发布于 2019-07-12 02:25:31
编辑:在下面的评论中由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>
}
}
编辑:
要获取未来的日期,简单地使用>
是行不通的。第一步是根据以下表达式完成的未来时间进行过滤。
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
2019-07-13 12:00:00上午11:15:00
2019-07-14 12:00:00上午11:15:00
2019-07-17 12:00:00 - 09:15:00
2019-07-17 12:00:00 AM 11:15:00
https://stackoverflow.com/questions/56994199
复制相似问题