以下是我的相关课程:
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
sTag
sName
s匹配给定列表中的所有字符串?
这是函数签名:
IList<Item> GetItemsWithTags(IList<string> tagNames);
我需要类似的东西:
from Item item
where !tagsNames.Except(
from item.Tags select item.Tags.Name
).Any()
select item
提前感谢您的帮助。
答案 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来获取Item
。 GROUP BY
和HAVING
组合可能在某些DBMS上效率低下。还有另一种使用迭代连接的查询方法,可能在某些DBMS上更有效但我无法使其工作(根据Criteria可能根本不可能)。如果我这样做,我会更新我的答案。