NHibernate запрос через несколько таблиц
Я использую NHibernate и пытаюсь понять, как написать запрос, который ищет все имена моих сущностей, и перечисляет результаты. В качестве простого примера у меня есть следующие объекты;
public class Cat {
public string name {get; set;}
}
public class Dog {
public string name {get; set;}
}
public class Owner {
public string firstname {get; set;}
public string lastname {get; set;}
}
В конечном итоге я хочу создать запрос, скажем, например, который и возвращает всех владельцев домашних животных с именем, содержащим "ted", или домашних животных с именем, содержащим"ted".
Вот пример SQL, который я хочу выполнить:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
OR c.name like '%ted%'
OR d.name like '%ted%'
Когда я делаю это, используя такие критерии, как этот:
var criteria = session.CreateCriteria<Owner>()
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
)
.CreateCriteria("Dog").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere))
.CreateCriteria("Cat").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere));
return criteria.List<Owner>();
Генерируется следующий запрос:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
AND d.name like '%ted%'
AND c.name like '%ted%'
Как я могу настроить свой запрос так, чтобы.CreateCriteria ("собака") И.CreateCriteria ("кошка") генерирует или вместо и?
Спасибо за помощь.
2 ответа:
Попробуйте это, может сработать.
var criteria = session.CreateCriteria<Owner>() .CreateAlias("Dog", "d") .CreateAlias("Cat", "c") .Add( Restrictions.Disjunction() .Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere)) .Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere)) .Add(Restrictions.Like("c.Name", keyword, MatchMode.Anywhere)) .Add(Restrictions.Like("d.Name", keyword, MatchMode.Anywhere)) );
Вам нужно объединить два критерия с помощью выражения.Или(условие1, условие2)
Подробнее здесь: http://devlicio.us/blogs/derik_whittaker/archive/2009/04/21/creating-a-nested-or-statement-with-nhibernate-using-the-criteria-convention.aspx
Хм, я думаю, что это будет выглядеть так (заимствовано немного из кода Баггидиггера)
Но я не заметил, что ты этого хочешь или что-то в этом роде. В этом случае добавление этих критериев к дизъюнкции, как показал Баггидиггер, наверное, так и надо поступить.var criteria = session.CreateCriteria<Owner>() .CreateAlias("Dog", "d") .CreateAlias("Cat", "c") .Add(Expression.Or(Expression.Like("c.Name", keyword, MatchMode.Anywhere) , Expression.Like("d.Name", keyword, MatchMode.Anywhere)) );