NHibernate实体投影

时间:2011-05-12 06:46:55

标签: c# .net nhibernate criteria-api queryover

我正在使用带有QueryOver API的NHibernate来查询我的域实体。问题是获得重复的结果。例如,在查询以下域时: domain

我使用的代码如下:

  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)?

3 个答案:

答案 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());避免重复记录。