簡體   English   中英

跨多對多和多對多關系的Nhibernate析取(“ OR”)查詢

[英]Nhibernate Disjunction (“OR”) Query Across Many-To-One and Many-To-Many Relationships

這個問題與這里的問題很接近,但並不相同: 跨多個表的NHibernate查詢

基本上,我的問題給出以下模型,我將如何查詢以查找當前狗的名稱為“ 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'

希望有道理...如果有人問,我會盡力澄清。

我嘗試使用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>();

希望對您有所幫助!

我想我應該剛開始是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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM