2013-02-01 16 views
3

我遇到意外的行爲,但對我而言並不清楚。當然,我可以使用不同的,但是是什麼原因?Nhibernate查詢加入(或讀取)return duplicates

實體(流利自動映射):

public class Ticket 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual IList<Activity> Activities { get; set; } 
} 

public class Activity 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual Ticket Ticket { get; set; } 
} 

測試數據(1票有5個活動):

new Ticket { Id = 1, Activities = new List<Activity> 
    { 
     new Activity(), new Activity(), new Activity(), new Activity() 
    }; 

查詢

var report = GetSessionFactory() 
    .OpenSession() 
    .QueryOver<Ticket>() 
    .JoinAlias(ticket => ticket.Activities,() => activity) 
    .List<Ticket>(); 

而且我有以下結果

enter image description here

回答

4

當你站在你加入了一個one-to-many表格,在您的案件1×5行要返回笛卡爾積。因此,如果你想沿着這條路線走,那麼你需要添加.TransformUsing(Transformers.DistinctRootEntity)

你確定你不想加載一個活動並使用懶加載的好處來檢索活動嗎?在大多數情況下,這可能是更有效的方法。

Somehing,如: -

var ticket = session.QueryOver<Ticket>.Where(w => w.Id == id).SingleOrDefault(); 
OR 
var ticket = session.Get<Ticket>(1); 

那麼你可以簡單地調用

foreach(var activity in ticket.Activities) 
{ 
// do something here.... 
} 
+0

我明白了。但是什麼原因?爲什麼NHibernate不會隱式執行它? –

+0

通過。這是nh開發團隊的問題。說實話,懶加載是你的朋友。 – Rippo

+2

建議什麼是導致SELECT N + 1 –