带有join(或fetch)的Nhibernate查询返回重复项

时间:2013-02-01 16:46:22

标签: nhibernate fluent-nhibernate queryover

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

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

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

1 个答案:

答案 0 :(得分:4)

当你加入one-to-many表时,你正在返回一个笛卡尔积,在你的情况下是1 x 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....
}