C# 如何有效地检索NHibernate中的链接行?
假设我的数据库中有这些表,这些表由web服务(WCF)通过NHibernate查询:C# 如何有效地检索NHibernate中的链接行?,c#,mysql,database,wcf,nhibernate,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" 患者可以接受任意数量的治疗。如果我想收集一份目前正在积极
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();
var patients=Session.CreateCriteria().List();
foreach(患者中的患者){
患者接受治疗。添加(
新患者治疗(患者){
治疗=Session.CreateCriteria()
.Add(Restrictions.Eq(“PatientId”,patient.Id)).List()
}
);
}
这涉及到结果集中每个患者的数据库往返,这是一个非常糟糕的想法。简单的NHibernate查询有什么神奇之处吗?还是我必须使用HQL(我还没有完全掌握):基本上,您的患者类中需要一个名为治疗的集合。在nHibernate映射中,您应该具有以下内容:
<many-to-one name="Treatments" column="TreatmentID" class="Treatment" fetch="select" cascade="none"/>
然后,您可以通过以下方式从患者检索所有治疗:
List<Treatment> treatments = yourPatient.Treatments;
List treatments=yourPatient.treatments;
NHibernate可以通过映射文件中的access=“noop”
在幕后添加关系(这意味着NHibernate知道这些关系,但不暴露于代码)
然后可以像HQL中任何正常声明的关系一样使用这些关系
从NHibernate 3.1.0开始,对于我来说,这有一个稍微不方便的副作用,即在运行查询时从另一个表中完全删除所有引用行,因此您可能需要在生产代码中使用
access=“noop”
之前进行双重检查。是的,这是一个选项。不过,我感兴趣的是,如果我不想在我的域类中公开关系(实际的代码会使这一点更难,因为关系在第二个表中),我想知道如何使用NHibernate的Criteria API(或HQL,如果必要的话)来实现这一点。您可以尝试使用别名,然后在Criteria中使用ProjectOnlist,但我不确定如果没有“治疗”的映射,这是否有效。你可以随时映射治疗并将其标记为“延迟加载”以提高效率。这样我就回到了原点:每次延迟加载治疗都需要往返数据库,这会将我0.5秒的查询变成一个需要几分钟才能完成的怪物。。。
List<Treatment> treatments = yourPatient.Treatments;