[英]How to get a set number of rows after ordering the records using 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條記錄,以按日期和時間的順序顯示,但是在顯示它們之前先對記錄進行排序。
這是示例數據集:
ID日期日期IsActive位置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 Friday 1 On-Campus 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
編輯: 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
方法。 第一步是通過下面的表達式對將來的時間進行過濾。 這個問題地址在C#中比較了DateTime
。 另請參閱Microsoft文檔以獲取.CompareTo
方法。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.