NHibernate Search с наследованием

У меня есть такой клиентский класс:

public class Client
{
    public Person Pers { get; set; }
}

И у меня есть дочерний класс 2 Person:

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, но я не знаю, как указать эту схему наследования...


person Paul    schedule 06.11.2009    source источник


Ответы (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));
person Jaguar    schedule 06.11.2009
comment
Спасибо, Jaguar... Я никогда не использовал DetachedCriteria, так что я немного запутался... Я не пытаюсь искать человека, но клиентов, которые определили человека... Можете ли вы показать мне, как это сделать? Спасибо - person Paul; 06.11.2009