nhibernate一对多集合-仅检索超类

nhibernate一对多集合-仅检索超类,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有以下课程: class Person { public string Name { get; set; } } class Employee : Person { public int Salary { get; set; } } class Company { public IList<Person> PeopleWhoAreNotEmployees { get; set; } } 班级人员 { 公共字符串名称{get;set;} } 员工类别:人

我有以下课程:

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

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

class Company
{
    public IList<Person> PeopleWhoAreNotEmployees { get; set; }
}
班级人员
{
公共字符串名称{get;set;}
}
员工类别:人
{
公共整数{get;set;}
}
阶级公司
{
非雇员的公共IList人员{get;set;}
}

人员和员工使用“表/类继承人”策略进行映射。
检索PeopleWhoaneNotEmployees集合时,我希望它只包含Person元素,而不是Employees元素。
如何(流畅地)配置集合以仅检索超类的元素?
我认为这与多态性属性有关,但我真的不知道如何做到这一点。


谢谢,
约翰尼

编辑:
在与Jamie讨论之后,我觉得我需要澄清的是,这里的案例并不是真正的个人和员工,而是员工和历史上的员工。
意思-当员工“死亡”时,他们不会被真正删除,
但他们会成为历史上的员工(还有一些属性,如终止日期等)。
显然,随着时间的推移,历史雇员的数量将在数量上超过雇员的数量,
因此,当我只需要当前雇员时,我无法获取所有历史雇员。
很抱歉,原来的问题模棱两可……
J


另外,我没有改变原来的问题,因为这会使答案变得无关紧要。
这个问题的新版本已经面世了

我不认为你可以,但无论如何我不会这样做。我将为集合使用私有字段,并公开过滤列表的方法。如果集合的大小合理(我不知道什么是合理的,但如果它小于1000,我就不担心它了),这将更容易映射和使用,而且性能也会很好。如果您有一个Person和Employee都可以扩展的抽象PersonBase类,那么就更容易了,这样您就不必处理人员可能是雇员的不确定性

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));
    }
}
上市公司
{
所有人的私人财产;
公共雇员人数()
{
返回_allPeople.OfType();
}
公共i非雇员人数()
{
return _allPeople.其中(x=>!(x为员工));
}
}
编辑:

作为对您评论的回应,过滤将在类中进行。私有集合将导致加载所有人,属性将动态筛选该集合。映射结果如下所示:

public class CompanyMap : ClassMap<Company>
{
    public CompanyMap ()
    {
        // only collection is shown w/o cascade option
        HasManyToMany(x => x.Person).Access.CamelCaseField(Prefix.Underscore);
    }
}
公共类公司映射:类映射
{
上市公司地图()
{
//仅显示不带级联选项的集合
HasManyToMany(x=>x.Person).Access.CamelCaseField(前缀.下划线);
}
}

我最后做的是在我的财产上使用了一个“where”子句。 fluent配置如下所示:

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

谢谢,这看起来很合理。两个问题:1。(nHiberntae nub问题)我的映射在这方面会是什么样子?我要绘制私人场地的地图吗?2..Where(..)是否保证过滤将在DB级别进行,或者将加载所有现有的People对象,然后在应用程序级别进行过滤?谢谢编辑,Jamie。不幸的是,这个解决方案对我来说是不可接受的,因为在我的情况下,员工比人多得多,所以我无法负担将所有员工加载到应用程序级别并在那里过滤他们;有没有办法确保在DB级别进行过滤?您是否分析了性能?加载的典型记录数是多少?在同一个会话中,访问PeopleWhoAnotEmployees集合而不访问Employees集合是正常的吗?我没有对其进行分析,但我认为我可能给出了一个不好的示例;我可能过于简化了。我对原始问题进行了编辑(希望)使情况更清楚一些。@sJohnny。这更有道理。我觉得你们应该问一个新问题,并加以澄清,以获得更好的答案。撇开我的头顶,我会考虑不把继承暴露给NHiBiNT,而是把它留在域模型中(或者使用接口)。历史上的雇员仍然会延长雇员的任期,但NHibernate不知道这种关系。