2013-02-01 14 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 –