【问题标题】:Getting current, previous and next schedule in Linq在 Linq 中获取当前、上一个和下一个时间表
【发布时间】:2017-11-08 15:11:38
【问题描述】:

我有一个记录患者日程的日程表。我想检索当前(今天的日程安排)、上一个日程安排(上次安排的时间)和下一个日程安排。 Schedule 表的结构是这样的

时间表

Id uniqueindentifier
PatientId uniqueindentifier
Start datetime
End datetime
Remarks varchar

当前、上一个和下一个将基于开始列。开始日期可以是任意日期(不连续)。

我的做法:

db.DbContext.Schedules.Where(i => DbFunctions.TruncateTime(i.Start)  == today && i.PatientId==patientId).Take(1)
    .Union(ctx.DbContext.Schedules.Where(i => DbFunctions.TruncateTime(i.Start) < today && i.PatientId == patientId).OrderByDescending(d => d.Start).Take(1))
    .Union(ctx.DbContext.Schedules.Where(i => DbFunctions.TruncateTime(i.Start) > today && i.PatientId == patientId).OrderBy(d => d.Start).Take(1))

我想知道它是否有效或有更好的选择。

【问题讨论】:

  • 你用的是什么ORM?
  • 实体框架6.0
  • 您为什么想知道是否有更好的选择?你有问题吗?不要陷入Premature Optimization

标签: c# sql-server linq entity-framework-6


【解决方案1】:

更好的方法将取决于您在使用此时间表后将做什么。

您的解决方案的一个问题是您目前不知道哪个时间表是TodayPreviousNext,但也许您也不需要它。

如果您需要了解它,一种解决方案可能是改用匿名类型

var schedule = db.DbContext.Schedules.Select(x => new {
    Today = x.Where(i => DbFunctions.TruncateTime(i.Start) == today && i.PatientId==patientId).Take(1),
    Previous = x.Where(i => DbFunctions.TruncateTime(i.Start) < today && i.PatientId == patientId).OrderByDescending(d => d.Start).Take(1),
    Next = x.Where(i => DbFunctions.TruncateTime(i.Start) > today && i.PatientId == patientId).OrderBy(d => d.Start).Take(1)
});

【讨论】:

    猜你喜欢
    • 2023-02-17
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多