我有以下课程:
class Person
{
public string Name { get; set; }
}
class Employee : Person
{
public int Salary { get; set; }
}
class Company
{
public IList<Person> PeopleWhoAreNotEmployees { get; set; }
}
使用table-per-class-heirarchy策略映射人员和员工。
当我检索PeopleWhoAreNotEmployees集合时,我希望它只包含Person和NOT Employees的元素。
我如何(流利地)配置集合以仅检索超类的元素?
我认为这与多态性属性有关,但我无法弄清楚如何做到这一点。
感谢,
的Jhonny
编辑:
在与Jamie讨论之后,我觉得我需要澄清一下,这里的案例不是真正的Person和Employee,而是更像Employee和HistoricalEmployee。
意思是 - 当员工'去世'时,他们并没有真正删除,但他们成为了HistoricalEmployee(还有一些属性,例如终止日期等)。
显然,随着时间的推移,HistoricalEmployees的数量将超过员工数量,因此当我只需要当前员工时,我无法获取所有HistoricalEmployees。
对不起原始问题的不确定性......
Ĵ
P.S.
我没有改变原来的问题,因为它会使答案无关紧要。
这个问题的新版本可用here
答案 0 :(得分:2)
我认为你不能,但不管怎样我都不会接近它。我将使用私有字段进行集合并公开过滤列表的方法。这更容易映射和使用,如果集合的大小合理,性能会很好(我不知道什么是合理的,但如果它是<1000则我不担心它)。如果你有一个抽象的PersonBase类,Person和Employee都会扩展,这样你就不必处理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));
}
}
编辑:
在回复您的评论时,过滤将在课程中进行。私有集合将导致加载所有People,并且属性将动态过滤该集合。映射看起来像:
public class CompanyMap : ClassMap<Company>
{
public CompanyMap ()
{
// only collection is shown w/o cascade option
HasManyToMany(x => x.Person).Access.CamelCaseField(Prefix.Underscore);
}
}
答案 1 :(得分:0)
我最终做的是在我的财产上使用'where'条款。 流畅的配置如下所示:
mapping.HasMany(x => x.Employees)
.Where("IsFired = 0")