假设我的数据库中有这些表,这些表由Web服务(WCF)通过NHibernate查询:
Table "Patients"
Column "Id"
Column "LastName"
Column "FirstName"
Column "Age"
Table "Treatments"
Column "Id"
Column "PatientId"
Column "Name"
Column "IsActive"
患者可以进行任何数量的治疗。如果我想收集一份目前正在接受治疗的患者名单,我怎么能在NHibernate中最有效地实现这一目标呢?
目前,我正在这样做(当然是使用SetFirstResult()和SetMaxResults()):
var patientsWithTreatments = new List<PatientWithTreatments>();
var patients = Session.CreateCriteria<Patient>().List<Patient>();
foreach(Patient patient in patients) {
patientsWithTreatments.Add(
new PatientWithTreatments(patient) {
Treatments = Session.CreateCriteria<Treatment>()
.Add(Restrictions.Eq("PatientId", patient.Id)).List<Treatment>()
}
);
}
这涉及到每个患者在结果集中往返数据库,这是一个非常糟糕的主意。有没有一些神奇的NHibernate查询,或者我必须使用HQL(我还没有牢牢掌握):)
答案 0 :(得分:0)
您基本上需要在Patient类中设置一个名为Treatments的集合。在你的nHibernate映射中你应该有类似的东西:
<many-to-one name="Treatments" column="TreatmentID" class="Treatment" fetch="select" cascade="none"/>
然后您可以通过以下方式检索患者的所有治疗:
List<Treatment> treatments = yourPatient.Treatments;
答案 1 :(得分:0)
NHibernate可以选择在映射文件中通过access="noop"
在幕后添加关系(这意味着它们对NHibernate是已知的,但不会暴露给代码)。
然后可以像HQL中任何正常声明的关系一样使用它们。
从NHibernate 3.1.0开始,对我来说,这有一个稍微不方便的副作用,即在运行查询时完全删除其他表中的所有引用行,因此您可能需要在使用之前仔细检查{生产代码中的{1}}。