【问题标题】:Sorting list after Date then time在日期和时间之后排序列表
【发布时间】:2016-09-03 18:45:38
【问题描述】:

所以我在一个网站 (MVC) 上工作,该网站在音乐节期间处理乐队的日程安排条目,我需要按逻辑顺序呈现预订,当我尝试订购它们时遇到了一些意想不到的困难。我的目标是先按日期排序,然后按时间排序。

我显然已经阅读了所有我能找到的类似问题,但似乎没有一个可以解决问题。

这是我的模型(在这种情况下很重要的部分):

public int ScheduleEntryId { get; set; }
public int ScheduleId { get; set; }
public int? BandId { get; set; }
public int? MovieId { get; set; }
public int? TechnicianId { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public DateTime EventDate { get; set; }

我正在尝试从特定乐队中获取排序的条目列表。所以这就是我目前所拥有的:

List<ScheduleEntry> scheduleEntries =
    db.ScheduleEntries.Where(x => x.BandId == band.BandId)
        .OrderBy(x => x.EventDate)
        .ThenBy(z => z.StartTime.Value).ToList();

这确实在日期之后对条目进行排序,而不是在时间之后。

我还尝试将 linq 和排序分开,以便我可以使用 .TimeOfDay,因为 linq 不支持该方法。这是我尝试过的:

var scheduleEntries = db.ScheduleEntries.Where(x => x.BandId == band.BandId).ToList();
scheduleEntries.OrderByDescending(z => z.EventDate.Date).ThenBy(z=> z.StartTime.Value.TimeOfDay);

我知道这很愚蠢,我可能遗漏了一些明显的东西,但我就是无法让它正常工作。非常感谢您的帮助。

【问题讨论】:

  • EventDate 是否包含一天中的时间?如果是这样,它可能会在不考虑第二个排序字段的情况下提供完整的排序。
  • 我不明白这个问题,按 DateTime 排序(假设它实际上是 DateTime 并且包含日期和时间)将完成“按日期,然后按时间”排序
  • 假设StartTime 确实包含正确的日期(存储在EventDate 中的日期,您可以尝试StartTime 排序而不是 EventDate 首先。
  • 我只是根据您的对象猜测,但EventDate 只是日期部分吗? StartTime 怎么可能可以为空?难道你不能将这两个属性结合起来,这样你就只有一个EventStartDateTimeEventEndDateTime?不应该要求 enddatestimes 吗?如果您仅将开始和结束用作时间部分,那么如果事件在午夜过后流血会发生什么?还是多天?
  • @Richard eventdate 包含完整的日期时间值,但时间方面将始终设置为 00.00.00。

标签: c# linq sorting datetime


【解决方案1】:

试试

List<ScheduleEntry> scheduleEntries = db.ScheduleEntries
  .Where(x => x.BandId == band.BandId)
  .OrderBy(x => x.EventDate)
  .ThenBy(z => z.StartTime)
  .ToList();

根据@IvanStoev 在 cmets 中的建议进行了编辑

【讨论】:

  • 不幸的是,这会导致以下错误:附加信息:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
  • 如果您手动运行此 SQL 查询(例如在 SQL Management Studio 中),您会得到正确的结果吗? select * from Schedule where BandId = 1 order by EventDate, StartTime
  • 你能用x.EventDate吗?
  • @Lasselito 然后.OrderBy(x =&gt; x.EventDate).ThenBy(x =&gt; x.StartTime) 也应该可以工作。你检查生成的 SQL 了吗?
  • @IvanStoev 我这辈子都无法理解为什么我没有第一次尝试这个。因为这行得通!我总是试图比必要的更具体。非常感谢 Ivan 和其他提供帮助的人!
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多