用于匹配所有标记的NHibernate查询

用于匹配所有标记的NHibernate查询,nhibernate,tags,hql,criteria,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 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; }
}
我需要像这样的东西:

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

提前感谢您的帮助。

您完全可以使用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();

这将为您提供一个
项目
ID列表,您可以使用该列表获取
项目
s。但是,在某些DBMS上,
groupby
具有
组合可能效率低下。还有另一种使用迭代联接的查询方法,在某些DBMS上可能更有效,但我无法让它工作(使用条件可能根本不可能)。如果有机会,我会更新我的答案。

对不起,我误读了你的问题,没有意识到你需要所有标签来匹配。我知道如何使用直接SQL实现这一点,但我必须考虑如何使用NHibernate实现这一点。。。我同时删除了我不正确的答案。这很有效,谢谢。作为将来的参考,在哪些系统上这可能是低效的?mysql.com网站建议,这将导致mysql使用带有filesort的临时表:但是,这可能已经过时或者已经改进了。。。我没有做过任何广泛的分析,也不太了解查询引擎的一般情况,所以我没有说这是否是一个常见的问题,这就是我强调的原因:)
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();