我有一个像这样的客户端类:
public class Client
{
public Person Pers { get; set; }
}
我有2个人的孩子班:
public class PersonType1 : Person
{
protected string att1;
protected string att2;
}
public class PersonType2 : Person
{
protected string att3;
protected string att4;
}
public class Person
{
protected string attx;
protected string atty;
}
因此,我的客户端可能是PersonType1或PersonType2 ......
我需要执行客户端搜索...该搜索的参数是att1,att2,att3,att4,attx,atty ...但所有这些都是可选的......
我正在尝试使用ICriteria执行该搜索,但我不知道如何指定继承方案......
答案 0 :(得分:1)
你真的不能这样做,因为在标准级别,Person类与任何派生类无关。结果集将是IList<Person>
,即使迭代通过集合将向您显示元素也将包含PersonType1和PersonType2类型(假设我们只是从DB中获取整个集合而没有任何限制)。
也就是说,您可以通过变通方法实现所需的效果: 将每个派生类型定义为新的子查询
var dc1 = DetachedCriteria.For(typeof(PersonType1)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att1", "foo"));
var dc2 = DetachedCriteria.For(typeof(PersonType2)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att3", "bar"));
对于N个派生类型,然后在主要Criteria查询上执行
CreateCriteria(typeof(Person)).Add(Subqueries.PropertyIn("Id", dc1) || Subqueries.PropertyIn("Id", dc2));
或者,ISQLQuery没有这样的限制。
编辑我正在添加以下必要的调整以查找客户端
我将重新编写标准为<Client>
条件,并对已加入的<Person>s
表达子查询限制。
var crit = ses.CreateCriteria(typeof(Client)).CreateCriteria("Person","per").Add(Subqueries.PropertyIn("per.Id", dc1) || Subqueries.PropertyIn("per.Id", dc2));