获取Linq的当前,上一个和下一个时间表

时间:2017-11-08 15:11:39

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

我有一张记录表,记录患者的时间表。我想检索当前(今天的时间表),之前的时间表(上次安排时间表)和下一个时间表。 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))

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

1 个答案:

答案 0 :(得分:0)

更好的方法取决于您使用此计划后将要执行的操作。

您的解决方案存在的一个问题是,您目前还不知道哪个时间表是TodayPreviousNext,但您可能也不需要它。< / p>

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

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)
});