![](/img/trans.png)
[英]NHibernate - mapping many-to-one and many-to-many lookup table relationships without using a second class
[英]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.