假设我在帖子和标签之间有多对多关系(使用ActiveRecord属性HasAndBelongsToMany)(更改域名对象名称以保护无辜者),我想要一个像
FindAllPostByTags(IList<Tag> tags)这样的方法返回所有包含参数中所有(不仅仅是部分)标签的帖子。无论使用NHibernate Expressions还是HQL,我都能以任何方式实现这一目标?我搜索了HQL文档,找不到符合我需求的东西。我希望我只是遗漏了一些明显的东西!
答案 0 :(得分:2)
您也可以使用IN
声明
DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray()) );
我没有编译,所以它可能有错误
答案 1 :(得分:0)
我现在没有安装Castle的系统,所以我没有测试或编译它,但下面的代码应该做你想要的。
Junction c = Expression.Conjunction();
foreach(Tag t in tags)
c = c.Add( Expression.Eq("Tag", t);
return sess.CreateCriteria(typeof(Post)).Add(c).List();
答案 2 :(得分:0)
我遇到了同样的问题,并尝试阅读HQL文档,但是NHibernate中似乎没有实现某些功能(例如使用-key)
我最终得到了这种解决方案:
select p FROM Post p JOIN p.Tags tag1 JOIN p.Tags tag2 WHERE tag1.Id = 1 tag2.Id = 2
意思是,为每个标记使用join动态构建HQL,然后在WHERE子句中进行选择。这对我有用。我尝试使用DetachedCriteria做同样的事情,但在尝试多次加入表时遇到了麻烦。