2012-01-10 32 views
4

假設我有兩個類:ParentChild。 A Parent有一個屬性Children,這當然是一個Child對象的集合。如何使用NHibernate查詢外鍵列而不檢索相關實體

Child沒有ParentId屬性。它具有Parent屬性。

所以,我對Child NHibernate的映射包括:

<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" /> 

而且我Parent映射包括:

<bag name="children" access="field" inverse="true" cascade="all-delete-orphan"> 
    <key column="ParentId" /> 
    <one-to-many class="Child" /> 
</bag> 

現在,這裏就是我想做的事:我想所有的Child對象與一定的ParentId。我知道我可以先獲得Parent,然後返回其Children財產。但是如果我想直接查詢Child表呢?

如果它是一個映射屬性(例如,Name),我可以使用NHibernate的標準,但在這種情況下,ParentId未映射。

我嘗試使用類似:

criteria.Add(Restrictions.Eq("Parent.Id", 1)); 

但是,這並不工作。我訴諸於使用SQLCriterion(如解釋here),但一位朋友/同事讓我覺得必須有更好的方法。

任何想法?與預測和Restrictions.EqProperty

回答

4

我已經完成了這個使用查詢。這裏有一個例子:

Child foundChild = 
    session.QueryOver<Child>() 
     .Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>(); 
+0

這給了我最乾淨的SQL(請參閱我對Jamie Ide的回答的評論),雖然差別不是太大。 – Peter 2012-01-11 08:04:38

+1

如果它找到父項的多個子項,將會引發異常。將SingleOrDefault更改爲List以返回父項的所有子項。 – 2012-01-11 12:46:33

+0

確實,我確實使用了List:session.QueryOver ().Where(x => x.Parent.Id == 1234).List() – Peter 2012-01-17 07:47:47

0

我認爲它可以通過標準就像這樣:

criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1)); 
+0

不幸的是,這給了我以下異常:NHibernate.Criterion中的類型不匹配。 SimpleExpression:父類預期類型MyDomain.Namespace.Parent,實際類型爲Castle.Proxies.INHibernateProxyProxy_4。這可能是我們的項目YMMV特有的。 – Peter 2012-01-11 08:02:21

6

你有別名關聯路徑。這將爲Parent返回一個代理,假定它正在使用延遲加載。您可以在不觸發負載的情況下訪問父級的Id屬性。

return _session.CreateCriteria<Child>() 
    .CreateAlias("Parent", "parent") 
    .Add(Restrictions.Eq("parent.Id", parentId)) 
    .List<Child>(); 
+0

這可以工作,但加入父表並選擇所有映射的列。 Cole W的回答並不會導致更清晰的SQL語句。這就是爲什麼+1這個答案,但科爾W's被標記爲答案。 – Peter 2012-01-11 08:03:45

相關問題