2010-12-07 12 views
0

私は以下のような国と州のドメインモデルを持っています(下記参照)。NHibernate/Hibernateでの集約オブジェクトの照会

私は、(Crieteria APIまたはHQLを使用して)特定の国のすべての州を取得したいと考えています。私はCountryCodeをパラメータとして受け取ります。

私はNHibernateの中で理解して何から、私は国をロードし、その後、私のcrieriaにExpression.Eq()を作ることができるように「国オブジェクト」と私の第二のリポジトリへの呼び出しを発行する必要があります。特定の国のすべての州を取得する方法はありますか?したがって、単一のクエリを使用しますか?私は単純なSQL内部結合を行い、そして国コードに制約を追加したいだけです。

投影とは関係があると確信していますが、私が見つけた唯一の例は単一のモデルのためであり、私が意図するものではないaggreate関数の使い方を示しています。

ありがとうございました!

私の現在のリポジトリの呼び出しは次のようになります。

public IList<Model.StateProvinces> LoadStateProvincesForAutocomplete(string partialName, string countryCode) 
{ 
    CountryRepository countryRepo = new CountryRepository(); 
    Model.Country currentCountry = countryRepo.Get(countryCode); 


    return 
    _session.CreateCriteria<Model.StateProvince>() 
     .Add(Expression.Eq("Country", currentCountry)) 
     .Add(Expression.Like("Name", partialName, MatchMode.Anywhere)) 
     .List<Model.StateProvince>(); 
} 

そして、私のモデルは、以下のように定義されています。あなたはICriteriaにラムダ拡張を使用する場合

public class Country 
{ 
    public virtual int Id { get; set; } 
    public virtual string Code { get; set; } 
    public virtual string NameEn { get; set; } 
    public virtual string NameFr { get; set; } 
    public virtual List<Model.StateProvince> StateProvinces { get; set; } 
} 

public class StateProvince 
{ 
     public virtual Country Country { get; set; } 
     public virtual int Id { get; set; } 
     public virtual string Code { get; set; } 
     public virtual string NameEn { get; set; } 
     public virtual string NameFr { get; set; } 
} 

答えて

0

は非常にシンプルであるべき:

session.CreateCriteria<StateProvince>().Add(s=>s.Country.NameEn == "United States").List(); 

これは、適切な結合と等価制約を追加する必要があります。ただし、tエンティティの関係はあなたのHBMに適切にマッピングされています。

また、NHibernate.Linq名前空間でLinq2NHを試してみてください:より深いカップルの層に行く、あなたがこれを読んで、私はLINQクエリを設定してい

session.Linq<StateProvince>().Where(s=>s.Country.NameEn == "United States").ToList(); 

。全く汗がない。

+0

ありがとうございますが、私は次のエラーで終わります。ラムダ式をデリゲートタイプではないため 'NHibernate.Criterion.ICriterion'に変換できません –

+0

NHibernate Lambda Extensionsを使用する必要があります。コアのNHibernateライブラリへのアドオン。 http://code.google.com/p/nhlambdaextensions/から入手できます。私はNH Criteriaモデル全体が既に世代の背後にあるので、Linq 2 NHibernateを個人的にお勧めします。 – KeithS

+0

あなたの時間に感謝キース!私は明日の朝Linq2 NHibernateをチェックするつもりだ! –

関連する問題