2012-03-15 51 views
1

下面的nhibernate查詢引起我的問​​題,因爲它會返回多個同一行,因爲子表有多個匹配提供條件的行。我想知道的是在nhibernate中執行此相同查詢的最有效/最佳實踐,但只需獲取DataMappingBase中的每一行一次。返回多個相同的行是打破我返回的結果數量,因爲我試圖限制它25但有時我得到相同的行25次。NHibernate多表查詢返回同一行不止一次

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    .List(); 

我目前正在在轉換上述查詢,以一種超然的查詢和刪除「拿」的條款,並得到它只是返回匹配行的ID,並把它在一個子查詢選擇使用從「DataMappingBase」行ID在子查詢返回的ID中,但我不確定這是否是最好的方式。

+0

您正在使用一個ISession或IStatelessSession? – Danielg 2012-03-15 18:12:23

+0

@Danielg ISession – Seer 2012-03-15 20:40:48

回答

2

我不知道,但你可以這樣做:

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    // add this 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List(); 
+0

感謝任何想法,如果這比使用子查詢更有效?我在上面討論的子查詢確實有效,但由於我期望在其他頻繁運行的查詢中遇到此問題,我希望能夠採用更高效的選項/最佳實踐。 – Seer 2012-03-15 20:42:55

+0

由於通常使用連接查詢的效率高於子查詢的效率,因此我認爲最好使用它。 – Anton 2012-03-15 21:04:06

+0

謝謝,我今晚會更新我的代碼。感謝您的快速詳細的答案 – Seer 2012-03-15 21:09:47