2010-12-16 16 views
1

を検索:
NHibernateの一対多集・私は、次のクラス持っている唯一のスーパー

class Person 
{ 
    public string Name { get; set; } 
} 

class Employee : Person 
{ 
    public int Salary { get; set; } 
} 

class Company 
{ 
    public IList<Person> PeopleWhoAreNotEmployees { get; set; } 
} 


者と従業員のテーブルあたりのクラス階層構造の戦略を使用してマッピングされます。
PeopleWhoAreNotEmployeesコレクションを取得するときに、「Person」と「Employees」以外の要素のみを含むようにします。
スーパークラスの要素のみを取得するようにコレクションを構成するにはどうすればよいですか。
多態性と関係すると思いますが、どうやってそれを行うのか本当に分かりません。


おかげで、
ジョニー

EDIT:ジェイミーとの議論以下
は、私はここの場合は、本当に人と従業員が、より多くの従業員とHistoricalEmployeeのようではないことを明確にする必要があります感じています。
意味 - 従業員が死亡したとき、彼らは実際に削除されていませんが、
ですが、終了日などのいくつかの属性を持つHistoricalEmployeeになります。
明らかに、HistoricalEmployeesの数は、従業員の数(
)を超えてしまいますので、現在の従業員だけが必要な場合はすべてのHistoricalEmployeesを取得できません。
元の質問のあいまいさに申し訳ありません...
J

P.S.
私は元の質問を変更していないので、答えが無関係になるでしょう。
この質問の新しいバージョンがありますhere

答えて

0

私のやり遂げたことは、自分の所有物に「where」句を使用していました。質問の非常にreasonable.coupleに見える

mapping.HasMany(x => x.Employees) 
      .Where("IsFired = 0") 
2

私はあなたができるとは思わないが、とにかくそれにアプローチする方法ではない。コレクションにプライベートフィールドを使用し、リストをフィルタリングするメソッドを公開します。これは地図作成や作業がはるかに簡単で、コレクションのサイズが合理的であればパフォーマンスは良好です(私は妥当なものはわかりませんが、それが<の場合は心配しません)。 PersonとEmployeeの両方が拡張された抽象PersonBaseクラスを持っていれば、Personが従業員かもしれないという不確実性に対処する必要がなくなります。

public class Company 
{ 
    private IList<Person> _allPeople; 

    public IEnumerable<Employee> Employees() 
    { 
     return _allPeople.OfType<Employee>(); 
    } 

    public IEnumerable<Person> PeopleWhoAreNotEmployees() 
    { 
     return _allPeople.Where(x => !(x is Employee)); 
    } 
} 

EDIT:あなたのコメントに応えて

、フィルタリングは、クラスで行われます。プライベートコレクションを使用すると、すべてのPeopleがロードされ、プロパティによってそのコレクションが動的にフィルタ処理されます。マッピングは次のようになります:

public class CompanyMap : ClassMap<Company> 
{ 
    public CompanyMap() 
    { 
     // only collection is shown w/o cascade option 
     HasManyToMany(x => x.Person).Access.CamelCaseField(Prefix.Underscore); 
    } 
} 
+0

おかげで、:1.(nHiberntaeナブ質問が)どのように私のマッピングは、このためのようになりますので、同じよう 流暢な構成が見えますか?プライベートフィールドをマップしますか? 2.フィルタリングがDBレベルで行われるか、または既存のすべてのPeopleオブジェクトがロードされ、アプリケーションレベルでフィルタリングされるかどうかは、どこのユーザー(?)が判断しますか? –

+0

編集のおかげで、ジェイミー。残念ながら、このソリューションは私の場合は受け入れられません。私の場合、Personよりも多くの従業員がいるため、すべての従業員をアプリレベルにロードしてフィルタリングする余裕がありません。フィルタリングがDBレベルで行われるようにする方法はありますか? –

+0

パフォーマンスをプロファイリングしましたか?ロードされるレコードの典型的な数は何ですか?同じセッションでEmployeesコレクションにアクセスせずにPeopleWhoAreNotEmployeesコレクションにアクセスするのは正常ですか? –

関連する問題