我正在尝试创建一个医院系统的以下模型。我的模型设置如下所示:
public class Patient
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public int ID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public DateTime DOB { get; set; }
public string FullName
{
get { return FirstName + ' ' + LastName; }
}
public virtual ICollection<InPatient> InPatients { get; set; }
}
public class InPatient
{
public int ID { get; set; }
public int Spell { get; set; }
public int PatientID { get; set; }
public int BedID { get; set; }
public int SourceID { get; set; }
public DateTime SourceDT { get; set; }
public string Destination { get; set; }
public DateTime? DestinationDT { get; set; }
public int Action { get; set; }
virtual public Patient Patient { get; set; }
virtual public Bed Bed { get; set; }
}
public class Bed
{
public int ID { get; set; }
public int WardID { get; set; }
public string BedTitle { get; set; }
public string BedSex { get; set; }
public string BedType { get; set; }
public virtual ICollection<InPatient> Inpatients { get; set; }
public virtual Ward Ward { get; set; }
}
public class Ward
{
public int ID { get; set; }
public string WardTitle { get; set; }
public virtual ICollection<Bed> Beds { get; set; }
}
我还创建了一个WardIndexData。
public class WardIndexData
{
public IEnumerable<InPatient> InPatients { get; set; }
public IEnumerable<Patient> Patients { get; set; }
public IEnumerable<Bed> Beds { get; set; }
public IEnumerable<Ward> Wards { get; set; }
}
对于控制器,我试图通过ward/details/WardID
访问Ward。由此,根据ID,它将显示该病房的所有床位(被占用或未被占用),并且床上的病人取决于InPatient
表 - BedID
匹配,并且没有DestinationDT
(因此患者仍在那里)。
对于我的控制器课程,我真的不知道如何让病房归还病人。我已经成功获得床位清单,但就是这样,我已经失去了玩代码。我知道,因为它目前是一个完整的混乱,但那是因为我完全混淆和散乱的东西,以获得一些工作。我真的把头发拉出来试图解决这个问题。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var viewModel = new WardIndexData();
viewModel.InPatients = db.InPatients
.Where(i => i.BedID == b.BedID)
.Include(i => i.SourceDT)
.Include(i => i.Bed.BedTitle)
.Include(i => i.Patient.FullName)
.Include(i => i.Bed.Ward.WardTitle);
return View(viewModel);
}
View(我也知道吐出错误):
@model APT.ViewModels.WardIndexData
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Ward</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.WardTitle)
</dt>
<dd>
@Html.DisplayFor(model => model.WardTitle)
</dd>
</dl>
<table class="ward">
<tr>
<th>Bed #</th>
<th>Patient Name</th>
<th>Admitted Date</th>
</tr>
@foreach(var item in Model.Beds)
{
ViewBag.bID = item.ID;
<tr>
<td>
@Html.DisplayFor(ModelItem => item.BedTitle)
</td>
<td>
Patient Name
</td>
<td>
Admitted Date
</td>
</tr>
}
</table>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
@Html.ActionLink("Back to List", "Index")
</p>
有人可以告诉我我做错了吗
答案 0 :(得分:0)
并非一切都很清楚,但我会尽力做出一些假设。
据我所知,您希望在病床上显示病床名单和病床名单(住院病人)。首先,我可以看到您的Bed
类型包含InPatient
个对象的集合。所以我相信你需要在某个时间点在床上展示病人。我的假设是您希望将其显示为DateTime.Now
,并且患者使用SourceDT
和DestinationDT
之间的床位。
总而言之,您的视图模型应该反映您要在视图上显示的内容,因此WardViewModel
(由您WardIndexData
调用)看起来应该更像这样:
public class WardViewModel
{
public string Name { get; set; }
public IList<BedInWardViewModel> Beds { get; set; }
}
和BedInWardViewModel
:
public class BedInWardViewModel
{
public string Title { get; set; }
public string PatientName { get; set; }
public string Admitted { get; set; }
}
因此,您应该编写LINQ查询,以便只获取您真正需要在视图中显示的值,而不是数据库的一半,因为您的应用程序很快就会终止数据库。
所以查询应该是这样的(未经测试):
var viewModel =
db.Wards
.Where(w => w.ID == id)
.Select(w => new WardViewModel
{
Name = w.WardTitle,
Beds = w.Beds
.Select(b => new
{
b.BedTitle,
InPatient = b.Inpatients.FirstOrDefault(
i => i.SourceDT < DateTime.Now && (!i.DestinationDT.HasValue || i.DestinationDT > DateTime.Now))
})
.Select(x => new BedInWardViewModel
{
Name = x.BedTitle,
PatientName = x.InPatient == null ? "[Free]" : x.Patient.Patient.FirstName + " " + x.InPatient.Patient.LastName,
Admitted = x.InPatient == null ? "[NA]" : x.InPatient.SourceDT.ToString()
})
.ToList()
})
.Single();
需要在主查询中选择“双”,以确保您不会尝试在空床上访问患者数据。
应该更改视图以反映视图模型中的更改,但我认为它应该是直截了当的。