首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在使用linq对记录进行排序后获得设置的行数?

如何在使用linq对记录进行排序后获得设置的行数?
EN

Stack Overflow用户
提问于 2019-07-12 01:06:36
回答 1查看 68关注 0票数 0

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

我试过了:

代码语言:javascript
复制
Model.Meetings.OrderBy(x => x.Date).ThenBy(x => x.Time).Take(5)

还有,

代码语言:javascript
复制
Model.Meetings.Take(5).OrderBy(x => x.Date.ThenBy(x => x.Time)

第一个似乎没有显示,或者实际上没有返回任何内容。

第二个可以工作并显示5条记录,但是哪5条记录呢?

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-12 02:25:31

编辑:在下面的评论中由OP澄清后,请参阅帖子末尾的更新答案。

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

代码语言:javascript
复制
@{ 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>
    }
}

编辑:

要获取未来的日期,简单地使用>是行不通的。第一步是根据以下表达式完成的未来时间进行过滤。

代码语言:javascript
复制
meetings.Where(x => x.Date.CompareTo(DateTime.Today) > 0)

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

代码语言:javascript
复制
meetings.Where(x => x.Date.CompareTo(DateTime.Today) > 0).OrderBy(x => x.Date).ThenBy(x => x.Time)

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56994199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档