2011-12-28 44 views
2

有一個實體努力具有財產列表和財產ADTYPE 我們有幾個廣告類型枚舉對象和specialLists枚舉對象選擇IList<Effort>NHibernate的QueryOver了許多表

我這樣做:

return NHibernateSession.QueryOver<Effort>() 
     .JoinQueryOver(effort => effort.AdType) 
       .WhereRestrictionOn(adType => adType.Id) 
       .IsIn(adTypes.Select(adt => (long)adt).ToList()) 
      .Clone() 
      .JoinQueryOver(effort => effort.List) 
       .WhereRestrictionOn(list => list.Id) 
       .IsIn(specialLists.Select(sl => (long)sl).ToList()) 
      .List<Effort>(); 

你可以看到我使用了一個沒有任何描述的奇怪的Clone()方法。它效果很好。

你用什麼方式查詢這些查詢?

+1

我很好奇,在這裏,如果你省略了克隆,亦是SQL被激發到數據庫會發生什麼? – Rippo

+0

沒有克隆()它不會嘗試做以下加入努力。它會嘗試將其轉換爲AdType。所以不會有.JoinQueryOver(effort => effort.List)它將會是.JoinQueryOver(adType => adType .....) – Anubis

回答

6

.JoinQueryOver(effort => effort.AdType)將返回一個子類型的QueryOver,在這裏AdTypeIQueryOver<Effort, Adtype>而不是原來的IQueryOver<Effort, Effort>。第一個通用參數是queryType,以及方法運行的類型的第二個參數。如果在整個查詢之間進行克隆,則複製並返回基地查詢IQueryOver<Effort, Effort>

爲了防止QueryOver切換到子類型,JoinAlias創建了一個別名而不是降序。

AdType adAlias = null; 
ListType listAlias = null; 

return NHibernateSession.QueryOver<Effort>() 
    .JoinAlias(effort => effort.AdType,() => adAlias) 
    .JoinAlias(effort => effort.List,() => listAlias) 
    .WhereRestrictionOn(() => adAlias.Id).IsIn(adTypes.Cast<long>().ToList()) 
    .WhereRestrictionOn(() => listAlias.Id).IsIn(specialLists.Cast<long>().ToList()) 
    .List<Effort>(); 

沒有,如果你只限制在adtype,詳情的ID和listtype然後

return NHibernateSession.QueryOver<Effort>() 
    .WhereRestrictionOn(effort => effort.Adtype.Id).IsIn(adTypes.Cast<long>().ToList()) 
    .WhereRestrictionOn(effort => effort.List.Id).IsIn(specialLists.Cast<long>().ToList()) 
    .List<Effort>();