2011-07-28 59 views
0

假設我在我的數據庫這些表是由Web服務(WCF)通過NHibernate的查詢:如何有效地檢索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

NHibernate的有添加的幕後關係的選項(這意味着他們」 NHibernate重新知道,但沒有暴露給代碼)通過映射文件中的access="noop"

這些然後可以像HQL中的任何正常聲明的關係一樣使用。

從NHibernate 3.1.0開始,對於我來說,這樣做有一點點不方便的副作用,即在查詢運行時從另一個表中完全刪除所有引用的行,因此您可能需要在使用前仔細檢查生產代碼中的access="noop"

0

您基本上需要在Patient類中有一個名爲Treatments的集合。在你的NHibernate的映射,你應該有這樣的:

<many-to-one name="Treatments" column="TreatmentID" class="Treatment" fetch="select" cascade="none"/> 

然後你就可以通過檢索所有來自患者的治療:

List<Treatment> treatments = yourPatient.Treatments; 
+0

是的,那是一種選擇。然而,我感興趣的是,如果我不想公開我的領域類中的關係(實際的代碼會使這一點變得更難一些),我知道如何使用NHibernate的Criteria API(或者HQL,如果有必要)來實現這一點因爲這種關係會在第二個表上) – Cygon

+0

您可以嘗試在標準中使用別名,然後使用ProjectionList,但我不確定這是否會在未處理「處理」的情況下起作用。你總是可以映射治療並將它們標記爲「延遲加載」來提高效率。 – willDaBeast

+0

未映射=映射:) – willDaBeast