2011-01-06 4 views
0

私は、データベースのPatientCaseテーブルにマップするPatientCaseというクラスを持っています。
データベース内のプロバイダテーブルにマップするProviderという別のクラスがあります。タイププロバイダのAncillaryProvider)PatientCaseTable
2にAssignedProviderIDする地図 - - マップは、NOW PatientCaseTable私の場合の基準を書く方法

でProviderID考える
をAncillaryProviderIDする
PatientCaseクラスは、プロパティ
1と2クラス)タイププロバイダのAssignedProviderを持っています、どのように私はケースをフィルタリングすることができPlzを私に

+0

を解決した方法ですか? –

+0

なぜこれの基準が必要ですか?動的である必要がありますか?静的クエリはHQLでははるかに簡単です。 –

答えて

1

を助けるように

AssignedProviderID = ProviderID 
        OR 
    AncillaryProviderID = ProviderID 

というオブジェクト私はそのIDを、引数としてプロバイダ自体を使用していないではないことを

session 
    .CreateCriteria<PatientCase>() 
    .Add(new Disjunction() 
    .Add(Restrictions.Eq("AssignedProvider", provider)) 
    .Add(Restrictions.Eq("AncillaryProvider", provider))); 

を:古典的な基準の長い道のりには、次のようです。 idの代わりにエンティティを扱うのが一般的に「オブジェクト指向」です。 IDSを使用するには、テーブルを結合することがあります。

session 
    .CreateCriteria<PatientCase>() 
    .CreateCriteria("AssignedProvider", "assigned") 
    .CreateCriteria("AncillaryProvider", "ancillary") 
    .Add(new Disjunction() 
    .Add(Restrictions.Eq("assigned.Id", providerId)) 
    .Add(Restrictions.Eq("ancillary", providerId))); 

が、少なくともNH 3.0(。例えばQueryOver)で、周りに簡単に、より読みやすい構文があります。

また、HQLでこれを行うには簡単です:

session 
    .CreateQuery(
    @"select case from PatientCase case 
    where case.AssignedProvider = :provider 
     or case.AncillaryProvider = :provider") 
    .SetEntity("provider", provider); 
0

感謝ステファン、 あなたの答えを通じ、私は判断基準についての詳細を学びました。 とにかく、ここで は、私は、問題のNHibernateのバージョン

caseCriteria.Add(
    Expression.Or(
     Expression.Eq("Provider.Providerid", providerId), 
     Expression.Eq("AncillaryProvider.Providerid", providerId) 
    ) 
); 
関連する問題