2011-12-16 5 views
1

私が進めているプロジェクトでは、4つのエンティティ(他の多数のメンバーの中に)、WorkOrder、Crew、CrewAssignment、Contractorがあります。Fluent nHibernateのHasManyマッピングで追加のフィルタリングはどのようにして行いますか?

  • A WorkOrderはは
  • Aクルーしか1請負
  • A CrewAssignmentを持っているを変更することができる1件の請負業者は、唯一これまで1クルー
  • A WorkOrderはは多くのCrewAssignmentsを持っていました:彼らの関係は、このようなものです

問題は、WorkOrderが複数のCrewAssignmentsを持つことができる最後の部分を設定していることです。私がしたいことは、WorkOrder.CrewAssignmentsプロパティが、WorkOrderと同じContractorを持つCrewを持つCrewAssignmentsだけを返すことです。または、「workOrder.Contractor == CrewAssignment.Crew.Contractor」という単語が少ない。

私が思いついた唯一のことはこれですが、x変数が定義されていないという例外がスローされます。

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor); 

これも同様ですか?それとも、間違った木を完全に吠えているのですか? Googleはこれで午前中に私に失敗している。何か案は?それはあなたを助けるが、ここでの私のテイクであることができれば、私は知らない

答えて

3

FluentNHibernateであなたが子供にフィルタリングするために、あなたのマッピングで設定することができますApplyFilterというメソッドを持っていますコレクション:インプリメンテーションに続いて

public class MyFilter: FilterDefinition 
{ 
    public MyFilter() 
    { 
     WithName("contractor").WithCondition("Crew.ContractorId== :contractorId").AddParameter("contractorId", NHibernate.NHibernateUtil.Int32); 
    } 
} 

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").ApplyFilter<MyFilter>().Cascade.AllDeleteOrphan(); 

は、次に、あなたのフィルタを作成することができますリポジトリの、あなたはフィルタを呼び出します。

Sessions.EnableFilter("contractor").SetParameter("contractorId", 1254); 

これが最善の解決策が、今の私の心に来る唯一のものである場合、私は知りません。

+0

私は別の投稿でそれについて読んでいましたが、どのようにしてCrewAssignment.Crew.ContractorIDとWorkOrder.ContractorIDが一致するかわかりません。そこに乗組員が組み込まれているようには見えません。 – rossisdead

+0

FluNameConfiguration.BuildSessionFactoryが呼び出されたときに、WithName引数で何を使用していても、 "Duplicated filter-def name"例外が発生します。 – rossisdead

+0

私は答えを変更しました。フィルタのWithConditionメソッド呼び出しとパラメータとしてのCrew.ContractorIdを見てください。例外についてはわからない。フィルタは同じ名前で2回定義されたようです。 –

関連する問題