C#+ Castle ActiveRecord:HasAndBelongsToMany和集合

时间:2008-09-24 20:17:56

标签: c# .net nhibernate hql castle-activerecord

假设我在帖子和标签之间有多对多关系(使用ActiveRecord属性HasAndBelongsToMany)(更改域名对象名称以保护无辜者),我想要一个像

FindAllPostByTags(IList<Tag> tags)
这样的方法返回所有包含参数中所有(不仅仅是部分)标签的帖子。无论使用NHibernate Expressions还是HQL,我都能以任何方式实现这一目标?我搜索了HQL文档,找不到符合我需求的东西。我希望我只是遗漏了一些明显的东西!

3 个答案:

答案 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做同样的事情,但在尝试多次加入表时遇到了麻烦。