nhibernate - 我在使用 Nhibernate Query Over fetch 时做错了什么吗?

标签 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

所以一个任务可以有很多个personalTask​​Reminders。我发现如果我设置了 2 个personalTask​​Reminders(所以 PersonalTask​​Reminders 现在将在它的 db 集合中有 2 行)

它两次返回相同的任务。

因此,如果我有 50 个针对该任务的个人任务提醒。我会得到 50 个相同任务的结果。我不明白为什么。

如果我删除急切加载。我按预期从数据库中取回了一项任务。

最佳答案

很明显,因为eager fetch 导致连接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>();

关于nhibernate - 我在使用 Nhibernate Query Over fetch 时做错了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221362/

相关文章:

c# - 具有多个参数的 Func 表达式

php - MySQL/PHP mysql_fetch_array() 始终丢失第一行

nhibernate - 有没有办法使用 NHibernate 和 Linq 合并来自两个 IQueryable<T> 的结果?

c# - 由于版本列为空,无法保存实体。 NHibernate

linq - 将 Linq 表达式组合到 Func 时遇到问题

php - Laravel/Eloquent 查询效率: Should a separate table be used for these two columns?

.net - 在此 Entity Framework 代码中,在我的 IObjectSet 对象上找不到 Include(..) 方法是什么?

reactjs - 将 Async 函数放入 useEffect 后出现错误

node.js - 如何从 ReactJS 中的任何 url 获取元数据(图像、标题、描述)

ruby-on-rails - 如何急切加载与 current_user 的关联?