NHibernate继承搜索

时间:2009-11-06 12:32:51

标签: c# nhibernate criteria icriteria

我有一个像这样的客户端类:

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执行该搜索,但我不知道如何指定继承方案......

1 个答案:

答案 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));