NHibernate 查询:包含在父属性或子属性中的字符串

Posted

技术标签:

【中文标题】NHibernate 查询:包含在父属性或子属性中的字符串【英文标题】:NHibernate query: string contained in either parent or child property 【发布时间】:2020-05-20 07:09:05 【问题描述】:

我正在把头发扯下来……

假设我们有一个博客列表,其中分配了标签。用户搜索任何词,结果必须包括:

    名称中包含OR一词的所有博客 任何标签名称中包含该术语的所有博客 仅名称与术语匹配的标签

实现此目的的 SQL 查询:

declare @query varchar(20) = '%name%';
SELECT *
 FROM Blogs blog
INNER join BlogTags bt on blog.ID = bt.BlogId --join table
INNER join Tags tag on tag.Id = bt.TagId
                   and tag.name like @query -- condition 3
WHERE blog.name like @query -- condition 1
   OR tag.name like @query -- condition 2

我整天都在尝试在 NHibernate 查询中进行这项工作,但我总是卡在 OR 条件上,因为它们不引用同一个对象。 使用Restrictions.Like 似乎并不理解我想要一个嵌套属性,并且过滤嵌套对象通常是使用CreateCriteria 完成的,这在Restrictions.Or 中不可用。 我也没有找到合并条件 3 的方法。

我真的不在乎它是使用QueryQueryOver 还是CreateCriteria 完成的。目前,我只想让它工作:)


可能相关的其他 SO 问题:

Filtering children 回答:Session.CreateCriteria<Parent>().CreateCriteria("Children").Add(/*...*/) Restrictions.Or String.Contains in NHibernate 回答:Session.QueryOver<Blog>().WhereRestrictionOn(c => c.Name).IsLike("")

【问题讨论】:

如果我没记错的话,这个查询没有多大意义。条件 3 等于条件 2,如果条件 3 是 true,则通过将条件 1 和 2 与 OR 组合起来,它们变为 true。但是如果条件 3 是false,则由于inner join,将不会返回该行。 【参考方案1】:

无论我在上面的评论如何,以下查询都应该可以解决问题(诀窍是使用别名)。我假设你有一个类Blog,它有一个属性List<Tag> Tags

Blog bAlias = null;
Tag tAlias = null;

var blogs = session.QueryOver<Blog>(() => bAlias)
  .JoinAlias(() => bAlias.Tags, () => tAlias)
  .WhereRestrictionOn(_ => tAlias.Name).IsLike("%name%") // condition 3
  .Where(Restrictions.Disjunction()
     .Add(Restrictions.On<Blog>(_ => bAlias.Name).IsLike("%name%")) // condition 1
     .Add(Restrictions.On<Tag>(_ => tAlias.Name).IsLike("%name%")) // condition 2
  )
  .List<Blog>();

但是,正如我在上面的评论中一样,条件 3 在这里并没有多大意义,除非您将 inner join 更改为 left outer join

【讨论】:

以上是关于NHibernate 查询:包含在父属性或子属性中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 NHibernate 中查询未映射的列

查询与 NHibernate 关系的一些属性

NHibernate Invalid Cast - 使用查询时属性类型不匹配

Fluent NHibernate - NHibernate.QueryException:无法解析属性

用NHibernate处理带属性的多对多关系

NHibernate - 仅更新在运行时识别的指定对象属性