2009-06-04 39 views
1

这里是我的相关类:NHibernate的查询匹配的所有标签

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小号匹配在给定列表中的所有字符串?

这是函数签名:

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

我需要的东西,如:提前

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

感谢您的帮助。

+0

对不起,我误解了你的问题,并没有意识到你需要*全部*标签来匹配。我知道如何用直接的SQL来做到这一点,但我不得不考虑如何使用NHibernate做到这一点......我在此期间删除了我的不正确答案。 – 2009-06-04 21:09:34

回答

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标识,你可以用它来获得Item的List。 GROUP BYHAVING组合可能虽然在某些DBMS上效率低下。还有另一种使用迭代连接的查询方法,可能对某些DBMS更有效,但我无法使其工作(根本无法使用Criteria)。如果我曾经这样做,我会更新我的答案。

+0

这工作,谢谢。为了将来的参考,哪些系统可能效率低下? – kuhlmancer 2009-06-10 23:29:41

相关问题