我是否在使用Nhibernate Query Over fetch做错了什么?

cho*_*bo2 3 nhibernate fetch eager-loading queryover

我有这个

   using (ITransaction transaction = session.BeginTransaction())
        {
            Task tAlias = null;
            CompletedTask cAlias = null;

            List<Task> tasks = session.QueryOver<Task>(() => tAlias)
                .Where(Restrictions.In(Projections.Property(() => tAlias.Course.Id), courseIds))
                .Fetch(pt => pt.PersonalTaskReminders).Eager
                .List<Task>().ToList().ConvertToLocalTime(student);


            transaction.Commit();

            return tasks;
        }

    PersonalTaskReminders == Collection
Run Code Online (Sandbox Code Playgroud)

因此任务可以有许多personalTask​​Reminders.我发现如果我设置2个personalTask​​Reminders(所以PersonalTask​​Reminders现在将从db的集合中有2行)

它返回两次相同的任务.

所以,如果我有50个personaltaskReminders用于该任务.我会得到50个相同任务的结果.我不明白为什么.

如果我删除了急切的加载.我按照预期从数据库中获取了一个任务.

xel*_*ion 17

很明显,因为急切获取导致与2个表连接.要消除重复的结果,您应该使用DistinctRootEntityTransformer.

顺便说一下,NHibernate为IN子句提供了更好的语法.所以你的查询应该是这样的:

    var tasks = Session.QueryOver<Task>()
            .WhereRestrictionOn(x => x.Id).IsIn(courseIds)
            .Fetch(pt => pt.PersonalTaskReminders).Eager
            .TransformUsing(Transformers.DistinctRootEntity)
            .List<Task>();
Run Code Online (Sandbox Code Playgroud)

  • @xelibrion - 对你来说可能很明显,但是当我通过nhibernate探测器看到原始sql为什么它正在进行连接时我不知道.与fetch和Fetch()有什么不同.渴望? (2认同)