2010-12-16 13 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和Not Employees的元素。
我怎樣才能(流利地)配置集合來只檢索超類的元素?
我認爲這與多態屬性有關,但我無法弄清楚如何做到這一點。


感謝,
的Jhonny

編輯:
在與傑米的討論,我覺得我需要澄清的是,這裏的情況是不是真的人與員工,而更像是員工和HistoricalEmployee。
含義 - 當員工「死亡」時,他們並沒有被真正刪除,
但他們成爲了HistoricalEmployee(還有幾個屬性,如終止日期等)。
顯然,隨着時間的推移,HistoricalEmployees的數量將超出員工數量的大小,
,因此當我僅需要當前員工時,我無法獲取所有HistoricalEmployees。
對不起原始問題的模糊不清...
J

P.S.
我沒有改變原來的問題,因爲它會使答案不相關。
這個問題的新版本是可用的here

回答

0

我最終做的是在我的屬性上使用'where'子句。 流利的配置看起來像這樣:

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

我不認爲你可以,但那不是我會如何處理它。我會爲集合使用專用字段並公開過濾列表的方法。如果集合的大小合理(這不知道什麼是合理的,但我不擔心它,如果它是< 1000),這將更容易映射和使用,並且性能會很好。如果你有一個Person和Person擴展的抽象PersonBase類,那麼你就不會處理一個Person可能是一個Employee的不確定性。

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)); 
    } 
} 

編輯:

在回答您的評論,過濾將發生在類。私人收藏會導致所有人被加載,並且屬性會動態地過濾該收藏。映射將如下所示:

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

感謝,看起來問題很reasonable.couple:1(nHiberntae結點問題)如何將我的映射看起來像這個?我會映射私人領域嗎? 2.在哪裏(..)顧問過濾將在數據庫級發生,還是將所有現有的People對象加載,然後在應用程序級別過濾? – 2010-12-19 08:48:33

+0

感謝編輯,傑米。不幸的是,這個解決方案對我來說是不可接受的,因爲在我的情況下,員工數量比人員多得多,所以我無法負擔將所有員工加載到應用程序級別並在那裏過濾;有什麼方法可以確保在數據庫級別進行過濾嗎? – 2010-12-21 07:14:12

+0

你是否描述過性能?加載的記錄的典型數量是多少?訪問PeopleWhoAreNotEmployees集合而不訪問同一會話中的Employees集合是否正常? – 2010-12-21 19:36:41