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 的方法。
我真的不在乎它是使用Query
、QueryOver
还是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 Invalid Cast - 使用查询时属性类型不匹配