C#+ Castle ActiveRecord:HasAndBelongsToMany和集合
时间:2020-03-06 14:41:14 来源:igfitidea点击:
假设我在帖子和标签(域名对象名称已更改以保护无辜者)之间存在多对多关系(使用ActiveRecord属性HasAndBelongsToMany),并且我想要一种类似
FindAllPostByTags(IList<Tag> tags)
返回所有在参数中具有所有(但不只是部分)标签的帖子。有什么办法可以使用NHibernate Expressions或者HQL做到这一点吗?我搜索了HQL文档,找不到适合我需求的任何内容。我希望我只是缺少一些明显的东西!
解决方案
我现在没有安装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();
我们也可以只使用一个IN
语句
DetachedCriteria query = DetachedCriteria.For<Post>(); query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray()) );
我还没有编译,所以可能有错误
我只是遇到了同样的问题,并尝试阅读HQL文档,但是某些功能似乎未在NHibernate中实现(例如,带有关键字)
我最终得到了这种解决方案:
select p FROM Post p JOIN p.Tags tag1 JOIN p.Tags tag2 WHERE tag1.Id = 1 tag2.Id = 2
意思是,对每个标记使用join动态地构建HQL,然后在WHERE子句中进行选择。这对我有用。我尝试使用DetachedCriteria做同样的事情,但是在尝试多次连接表时遇到麻烦。