NHibernate查询匹配所有标签

时间:2009-06-04 06:58:51

标签: nhibernate tags hql criteria

以下是我的相关课程:

public class Item {
    public virtual int Id { get; protected set; }
    public virtual IList<Tag> Tags { get; set; }
}

public class Tags {
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
    public virtual IList<Item> Items { get; set; }
}

这些映射具有多对多关联。中间表名为ItemsToTags。

以下是问题:

  

给定一个字符串列表,如何创建一个NHibernate查询,返回所有Item s Tag s Name s匹配给定列表中的所有字符串?

这是函数签名:

IList<Item> GetItemsWithTags(IList<string> tagNames);

我需要类似的东西:

from Item item
where !tagsNames.Except(
    from item.Tags select item.Tags.Name
).Any()
select item

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你绝对可以用HQL做到这一点;我已经成功测试了它。

var items = session.CreateQuery("SELECT i.Id FROM Item i JOIN i.Tags tags WHERE tags.Name IN(:tags) GROUP BY i HAVING COUNT(DISTINCT tags) = :tagCount")
        .SetParameterList("tags", tagNames)
        .SetInt32("tagCount", tagNames.Count)
        .List();

这会为您提供Item ID列表,您可以使用这些ID来获取ItemGROUP BYHAVING组合可能在某些DBMS上效率低下。还有另一种使用迭代连接的查询方法,可能在某些DBMS上更有效但我无法使其工作(根据Criteria可能根本不可能)。如果我这样做,我会更新我的答案。