1

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

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

4

1 回答 1

1

您确实不能这样做,因为在标准级别上,Person 类与任何派生类无关。结果集将是一个IList<Person>即使遍历集合将显示元素还将包含 PersonType1 和 PersonType2 类型(假设我们只是从数据库中获取整个集合而没有任何限制)。

也就是说,您可以通过一种解决方法达到预期的效果:将每个派生类型定义为新的子查询

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));
于 2009-11-06T14:28:39.873 回答