我有一张记录表,记录患者的时间表。我想检索当前(今天的时间表),之前的时间表(上次安排时间表)和下一个时间表。 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))
我想知道它是否有效或者有更好的选择。
答案 0 :(得分:0)
更好的方法取决于您使用此计划后将要执行的操作。
您的解决方案存在的一个问题是,您目前还不知道哪个时间表是Today
,Previous
,Next
,但您可能也不需要它。< / 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)
});