2008-09-24 36 views
3

假设我在帖子和标签(为了保护无辜者而更改了域对象名称)之间有多对多关系(使用ActiveRecord属性HasAndBelongsToMany),并且我想要一个方法,如C#+ Castle ActiveRecord:HasAndBelongsToMany和集合

FindAllPostByTags(IList<Tag> tags)
它会返回所有包含参数中所有(不仅仅是一些)标签的帖子。任何我可以用NHibernate Expressions或HQL完成这个任务的方法?我搜索了HQL文档,找不到符合我需求的任何内容。我希望我只是错过了一些明显的东西!

+0

下面是否有任何答案适合您?如果是这样,那么回答一个忙,并接受它。 – 2009-12-17 14:45:11

回答

2

你也可以只使用一个IN声明

DetachedCriteria query = DetachedCriteria.For<Post>(); 
query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray())); 

我还没有编译的,因此可能有错误

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(); 
0

我有同样的问题,并试图读取HQL-文档,但是一些功能似乎并没有在NHibernate中实现(例如使用关键字)

我结束了这种解决方案:

 
select p 
FROM Post p 
JOIN p.Tags tag1 
JOIN p.Tags tag2 
WHERE 
    tag1.Id = 1 
    tag2.Id = 2 

含义,使用每个标记的连接动态构建HQL,然后在WHERE子句中进行选择。这对我有效。我试图用DetachedCriteria做同样的事情,但试图多次加入表时遇到了麻烦。