如何在NHibernate中有效地检索链接的行?

时间:2011-07-28 10:29:21

标签: c# mysql database wcf nhibernate

假设我的数据库中有这些表,这些表由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(我还没有牢牢掌握):)

2 个答案:

答案 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}}。