Nhibernate Disjunction («ИЛИ») запрос через отношения «многие к одному» и «многие ко многим» - PullRequest
2 голосов
/ 24 августа 2011

Этот вопрос близок, но не совпадает с приведенным здесь: NHibernate Query для нескольких таблиц

По сути, мой вопрос задается по следующей модели, как мне запросить, чтобы найтиout, если текущая собака имеет имя «foo» или прошедшая собака имеет имя «foo» (дизъюнкция). По сути, у меня есть отношение «многие к одному» для CurrentDog и отношение «многие ко многим» для PastDogs.

public class Dog {
    public string name {get; set;}
}

public class Owner {
    public string firstname {get; set;}
    public string lastname {get; set;}
    public Dog CurrentDog {get; set;}
    public Dog[] PastDogs {get; set;}
}

Я думаю, что SQL должен выглядеть примерно так:

    SELECT o.* FROM owners AS o
    INNER JOIN dogs AS cd ON o.current_dog_id = cd.id
    INNER JOIN owner_past_dog_maps AS pd ON o.id = pd.owner_id
    INNER JOIN dogs AS d ON pd.dog_id = d.id
    WHERE d.name = 'foo' 
    OR cd.name = 'foo'

Надеюсь, что это имеет смысл ... Я постараюсь уточнить, если кто-нибудь спросит.

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Я пытаюсь решить эту проблему, используя QueryOver и псевдоним

Owner myOwner = null;
Dog myCurrentDog = null; 
Dog myPastDogs = null;

var sax = _HibSession.QueryOver<Owner>(() => myOwner)
                .JoinAlias(() => myOwner.CurrentDog, () => myCurrentDog, JoinType.InnerJoin)
                .JoinAlias(() => myOwner.PastDogs, () => myPastDogs , JoinType.InnerJoin)
                .Where(Restrictions.Disjunction()
                    .Add(Restrictions.EqProperty(myCurrentDog.Name,"foo"))
                    .Add(Restrictions.EqProperty(myPastDogs.Name,"foo"))                    
                )                                            
                .List<Owner>();

Надеюсь, это полезно!

0 голосов
/ 24 августа 2011

Полагаю, мне следовало начать с того, что я новичок в NHibernate. Чего я не понял, так это псевдонимов в NHibernate, и вы создаете псевдонимы не для таблиц, а для отношений и имен свойств. Вот решение, которое вернет всех владельцев, у которых есть или была собака по кличке foo:

    var output = Session.CreateCriteria<Owner>()
        .CreateAlias("CurrentDog", "cd")
        .CreateAlias("PastDogs", "pd")
        .Add
        (
            Restrictions.Disjunction()
            .Add(Restrictions.Eq("cd.Name", "foo"))
            .Add(Restrictions.Eq("pd.Name", "foo"))
        )
        .List<Owner>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...