3

我使用 NHibernate 和 QueryOver API 来查询我的域实体。问题是得到重复的结果。例如在查询以下域时: 领域

我使用如下代码:

  var list = Session.QueryOver<Post>()
                    .JoinQueryOver<Comment>(x => x.Comments)
                    .Where(c => c.Name == "Name")
                    .Take(5)
                    .List();

生成的 SQL 将如下所示:

SELECT Top(5) * FROM Posts p left outer join Comments c on p.Id = c.PostId

这里的问题是左连接完成后,结果记录集有超过 5 行。然后TOP函数应用并削减结果。因此,例如,如果第一篇文章有​​ 5 条评论,我会得到这篇文章 5 次,不会得到其他人。

我知道它为什么会发生,并找到了一篇关于它的好帖子。但是是否有一个投影会告诉 nhibernate 只Post从实体中选择列而不从实体中添加列Comment?也许应该使用其他方法(不是 JoinQueryOver)?

4

3 回答 3

3

首先,您需要从 Comment 到 Post 的引用。我假设它被称为“Post”。

然后使用子查询过滤掉评论和后续帖子。

//the alias for post
Post post = null; 

var list = Session.QueryOver(() => post)
            .WithSubquery.WhereProperty(() => post.Id)
                .In(NHibernate.Criterion.QueryOver.Of<Comment>()
                    .Where(c => c.Name == "Name")
                    .Select(c => c.Post.Id))
            .Take(5)
            .List();

生成的 SQL 应该是这样的:

SELECT Top(5) * FROM Posts p where p.Id in (select PostID from Comments c where c.Name = 'Name')
于 2011-05-12T08:25:59.643 回答
0

如果您想避免加入结果中的重复,您可以使用 Transformer DistinctRootEntityResultTransformer 这个转换器将从帖子中删除重复,但如果它们与另一个实体加入,它不会从评论中删除重复。在这种情况下,您将不得不开发自己的转换器来删除第二级的重复。

于 2012-06-12T12:48:58.987 回答
-2

我们使用了 criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()); 以避免重复记录。

于 2011-05-12T06:53:48.840 回答