簡體   English   中英

使用linq對記錄進行排序后,如何獲得固定的行數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM