1

这是我的相关课程:

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 查询来返回所有ItemsTagName给定列表中的所有字符串匹配的所有 s?

这是函数签名:

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

我需要类似的东西:

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

提前感谢您的帮助。

4

1 回答 1

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可用于获取Items 的 ID 列表。不过,GROUP BYandHAVING组合在某些 DBMS 上可能效率低下。还有另一种使用迭代连接的查询方法,它在某些 DBMS 上可能更有效,但我无法让它工作(使用 Criteria 可能根本不可能)。如果我这样做,我会更新我的答案。

于 2009-06-04T22:32:57.493 回答