Запрос NHibernate через несколько таблиц

Я использую NHibernate и пытаюсь выяснить, как записать запрос, что searchs все названия моих объектов, и перечисляет результаты. Как простой пример, у меня есть следующие объекты;

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;}
}

Eventaully я хочу создать запрос, сказать, например, который и возвращает всех владельцев домашних животных с именем, содержащим "Теда", домашних животных Орегона с именем, содержащим "Теда".

Вот пример 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 ("CAT") генерировали ИЛИ вместо И?

спасибо за помощь.

8
задан Dai Bok 22 April 2010 в 15:04
поделиться

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))
            );
5
ответ дан 5 December 2019 в 21:17
поделиться

Вам необходимо объединить два критерия с использованием Expression.Or (критерии1, критерии2)

Подробнее здесь: http://devlicio.us/blogs/derik_whittaker/archive/2009/04/21/creating-a-nested-or-statement-with- nhibernate-using-the-criterion.aspx

Хм, я думаю, это будет выглядеть примерно так (немного позаимствовано из кода BuggyDigger)

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

Но я не заметил, что вы хотели ИЛИ все. В этом случае добавление этих критериев к дизъюнкции, как показал BuggyDigger, вероятно, будет правильным решением.

2
ответ дан 5 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: