Nhibernate使用subselect进行多对多标准查询

时间:2009-06-22 13:47:40

标签: c# nhibernate

我有一个简单的博客示例:Post表,Tag表和链接这两个表的Post_Tag_MM查找表。

我使用这个hql查询来获取所有帖子,DONT有一些标签:

            var result = session
                            .CreateQuery(@"
                                select p from Post p 
                                join p.Tags t 
                                where (select count(ti) from p.Tags ti where ti.Uid in (:uidList)) = 0
                            ")
                            .SetParameterList("uidList", uidList)
                            .SetResultTransformer(new DistinctRootEntityResultTransformer())
                            .List<Post>();

如何将这种多对多查询和子选择转换为条件查询?

我还不太了解DetachedCriteria API,但无法让它返回正确的结果集。

非常感谢你。

此致

最高

3 个答案:

答案 0 :(得分:2)

如果我已正确理解了这个问题,那么你有一个包含名为Post_Tag_MM的PostId,TagId关系的连接表,并且你想要所有没有任何标签ID标签的帖子。然后,在普通的SQL中你可以这样做:

从id不在的帖子中选择*(从Post_Tag_MM中选择不同的PostId,其中TagId在(1,2,3)中);

使用DetachedCrietria API,假设您已将Post_Tag_MM表映射到PostTag类,该子查询将如下所示:

var subCriteria = DetachedCriteria.For(typeof (PostTag))
    .SetProjection(Projections.Property("PostId"))
    .Add(Restrictions.PropertyIn("TagId", tagIdList));

将'属性'子查询标准附加并否定为您的主要标准

var result = session.CreateCriteria.For(typeof(Post))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .Add(Subqueries.PropertyNotIn("Id", subCriteria))
    .List<Post>();

答案 1 :(得分:0)

您需要使用DetachedCriteria来表示子选择。然后将该查询添加到具有子查询约束的CreateCriteria。

答案 2 :(得分:-1)

尝试以下方法。假设uidList是标签ID的集合。

var results = S.CreateCriteria(typeof(Post))
               .CreateCriteria("Tags")
               .Add(
                   Expression.Not(
                     Expression.In("Uid", uidList)
                   )
                )
               .List<Post>();

可能有一种更有效的方法,尽管这在过去对我有用。 它可能不是语法完美,但我希望,一般原则应该让你再次移动。