首页 > 解决方案 > NHibernate 查询:包含在父属性或子属性中的字符串

问题描述

我正在把头发扯下来……

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

  1. 名称中包含术语OR的所有博客
  2. 任何标签名称包含该术语的所有博客
  3. 只有名称与术语匹配的标签

实现此目的的 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 条件上,因为它们没有引用同一个对象。usingRestrictions.Like似乎不明白我想要一个嵌套属性,并且过滤嵌套对象通常是使用CreateCriteriawhich 在Restrictions.Or. 我还没有找到合并条件 3 的方法。

我真的不在乎它是否使用Query,QueryOverCreateCriteria. 目前,我只想让它工作:)


可能相关的其他 SO 问题:

标签: c#sqlnhibernate

解决方案


无论我在上面的评论如何,以下查询都应该可以解决问题(诀窍是使用别名)。我假设您有一个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 joinleft outer join.


推荐阅读