我正在使用带有QueryOver API的NHibernate来查询我的域实体。问题是获得重复的结果。例如,在查询以下域时:
我使用的代码如下:
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次,不会得到其他人。
我知道为什么会发生这种情况并找到一个很好的post。
但是有一个投影会告诉nhibernate只选择Post
实体中的列而不是在select Comment
实体中添加列吗?也许应该使用其他一些方法(不是JoinQueryOver)?
答案 0 :(得分:3)
首先,您需要从Comment到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')
答案 1 :(得分:0)
如果你想避免重复加入的结果你可以使用Transformer DistinctRootEntityResultTransformer这个转换器将从帖子中删除重复,但如果它们与另一个实体连接,它将不会从注释中删除重复。在这种情况下,您必须开发自己的变换器以删除第二级的重复。
答案 2 :(得分:-2)
我们使用了criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());避免重复记录。