2009-06-10 2 views
0

大きなプロジェクトにNHibernateを使ったのは初めてです。基本的に、私は5つのフィールドに基づいて検索を実行する必要があります。NHibernate joinの反復

テーブルに結果を表示したいとします。ここで私が書いたテストは、基本的に "DII"というスタッフとIntakesを持つすべてのクライアントを取得します。私が実行すると、Intakesのいくつかがnullであるというエラーが表示されます。

var name = new Name("Alice", "B." "Cooper"); 
var staff = "DII"; 
var fileNumber = 12345; 

var crit = NHibernateHelper.GetCurrentSession().CreateCriteria(typeof(Client)); 
var result = crit.CreateAlias("Intakes", "i");    
     .Add(Restrictions.Like("Name.First", name.First + "%")); 
     .Add(Restrictions.Like("Name.Middle", name.Middle + "%")); 
     .Add(Restrictions.Like("Name.Last", name.Last + "%")); 
     .Add(Restrictions.Eq("i.Staff", staff));    
     .Add(Restrictions.Eq("i.FileNumber", fileNumber)); 
     .List<Client>(); 

foreach (var client in result) 
{ 
    Assert.IsTrue(client.Intakes.All(i => i.Staff == "DII"); 
} 

ただし、正しいクライアント数が返されます。私の質問は、上記のICriteriaによって生成されたクエリによって返された、関連するIntakesだけをどのように反復するのですか?

私がする最後の行の変更を試みた:

Assert.IsTrue(c.Intakes.Where(i => i != null).All(i => i.Staff == "DII")); 

をそして、それはSQLが生成されたことを除いて、正常に動作するには、次のとおりです。それは参加し実行し、その後、すべてのフェッチ意味

SELECT (Client + Intake Join) ... 
SELECT FROM IntakeTable ... 
SELECT FROM IntakeTable ... 
SELECT FROM IntakeTable ... 
(for each Intake that was returned with the join) 

再び私が望むものではない摂取量。

答えて

0

Doh、考え出しました。それは私のマッピングのせいだった。私は以下を使用していました:

<list ... /> 

...そして、非ポジション列による注文。そのため、私はIntakesの関連付けにヌル・エントリーを集めていました。

私はそれを注文した袋に変え、あなたが期待したようにすべてが機能しました。