具有联接(或获取)的Nhibernate查询返回重复项

具有联接(或获取)的Nhibernate查询返回重复项,nhibernate,fluent-nhibernate,queryover,Nhibernate,Fluent Nhibernate,Queryover,我遇到了意想不到的行为,这对我来说并不清楚。当然我可以使用distinct,但原因是什么 我有实体(流畅的自动映射): 公共舱票 { 公共虚拟整数Id{get;set;} 公共虚拟字符串标题{get;set;} 公共虚拟IList活动{get;set;} } 公共课堂活动 { 公共虚拟整数Id{get;set;} 公共虚拟字符串标题{get;set;} 公共虚拟票证{get;set;} } 测试数据(1张有5项活动的门票): newticket{Id=1,Activities=newlist

我遇到了意想不到的行为,这对我来说并不清楚。当然我可以使用distinct,但原因是什么

我有实体(流畅的自动映射):

公共舱票
{
公共虚拟整数Id{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟IList活动{get;set;}
}
公共课堂活动
{
公共虚拟整数Id{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟票证{get;set;}
}
测试数据(1张有5项活动的门票):

newticket{Id=1,Activities=newlist
{
新活动(),新活动(),新活动(),新活动()
};
查询

var report = GetSessionFactory()
    .OpenSession()
    .QueryOver<Ticket>()
    .JoinAlias(ticket => ticket.Activities, () => activity)
    .List<Ticket>();
var报告=GetSessionFactory()
.OpenSession()
.QueryOver()
.JoinAlias(票证=>ticket.Activities,()=>activity)
.List();
我有以下结果

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

当您加入一对多的
表时,您返回的是笛卡尔积,在您的情况下是1 x 5行。因此,如果您想沿着这条路线走,那么您需要添加
.TransformUsing(Transformers.distincrotenty)

您确定不想加载活动并使用延迟加载的优点来检索活动吗?在大多数情况下,这可能是更有效的方法

比如:-

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

我明白了。但原因是什么?为什么NHibernate不隐式地这么做?通过。这是nh开发团队的问题。老实说,延迟加载是你的朋友。建议选择N+1。确保启用了
批量大小
,而不是选择N+1
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....
}