Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何有效地检索NHibernate中的链接行?_C#_Mysql_Database_Wcf_Nhibernate - Fatal编程技术网

C# 如何有效地检索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" 患者可以接受任意数量的治疗。如果我想收集一份目前正在积极

假设我的数据库中有这些表,这些表由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();
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;