2011-07-28 10 views
0

は、私はNHibernateは介してウェブサービス(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

:次に、あなたがすることによって、患者からのすべての治療法を取得することができ

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

:あなたNHibernateはマッピングでは、のようなものを持っている必要がありますNHibernateには知られていますが、コードに公開されていません)。access="noop"をマッピングファイルに追加します。

これらは、HQLの通常の宣言関係のように使用できます。

NHibernate 3.1.0では、クエリ実行時に参照されている行をすべて他のテーブルから完全に削除するという面倒な副作用がありましたので、使用する前に再度確認してくださいプロダクトコードのaccess="noop"

0

あなたは基本的にTreatmentsというPatientクラスのコレクションを持つ必要があります。 NHibernateのは、「彼らを意味する(舞台裏の関係を追加するオプションを持っている

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

はい、これは1つのオプションです。私が関心を持っているのは、私のドメインクラスで関係を公開したくない場合、NHibernateのCriteria API(または必要ならHQL)でこれをどのように達成できるかを知ることです(実際のコードはこれを少し難しくします)関係は2番目のテーブルに行くので) – Cygon

+0

エイリアスを使用してからProjectionListをCriteria内で試してみることができますが、これは 'Treatments'がマップされていないと機能しないかどうかはわかりません。あなたはいつも、トリートメントをマッピングして効率を改善する「レイジーローディング」としてマークすることができます。 – willDaBeast

+0

unmapped = mapped :) – willDaBeast

関連する問題