【问题标题】:NHibernate query for matching all tags用于匹配所有标签的 NHibernate 查询
【发布时间】:2010-10-31 05:49:56
【问题描述】:

这是我的相关课程:

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 查询来返回所有 Tags 和 Names 与给定列表中的所有字符串匹配的所有 Items?

这是函数签名:

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

我需要类似的东西:

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

提前感谢您的帮助。

【问题讨论】:

  • 对不起,我误读了你的问题,没有意识到你需要 all 标签来匹配。我知道如何使用直接 SQL 来做到这一点,但我必须考虑如何使用 NHibernate 来做到这一点......同时我已经删除了我的错误答案。

标签: nhibernate tags hql criteria


【解决方案1】:

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

【讨论】:

  • 这行得通,谢谢。为了将来参考,这可能在哪些系统上效率低下?
  • mysql.com 网站建议它会导致 MySQL 使用带有文件排序的临时表:forge.mysql.com/wiki/… 但是,这可能已经过时或可能已经改进......我没有做过任何广泛的分析并且对查询引擎的了解不够,一般来说这是否是一个常见问题,所以这就是为什么我强调可能 :)
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多