c# - NHibernate 查询:包含在父属性或子属性中的字符串
问题描述
我正在把头发扯下来……
假设我们有一个博客列表,其中分配了标签。用户搜索任何术语,结果必须包括:
- 名称中包含术语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 条件上,因为它们没有引用同一个对象。usingRestrictions.Like
似乎不明白我想要一个嵌套属性,并且过滤嵌套对象通常是使用CreateCriteria
which 在Restrictions.Or
. 我还没有找到合并条件 3 的方法。
我真的不在乎它是否使用Query
,QueryOver
或CreateCriteria
. 目前,我只想让它工作:)
可能相关的其他 SO 问题:
- 过滤孩子
- 回答:
Session.CreateCriteria<Parent>().CreateCriteria("Children").Add(/*...*/)
- 回答:
- 限制。或
- NHibernate 中的 String.Contains
- 回答:
Session.QueryOver<Blog>().WhereRestrictionOn(c => c.Name).IsLike("")
- 回答:
解决方案
无论我在上面的评论如何,以下查询都应该可以解决问题(诀窍是使用别名)。我假设您有一个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
.
推荐阅读
- java - 修饰符 'static' 只允许在常量变量声明中使用?
- python - 如何使用 lmfit 的优化参数找到函数的面积(伪 Voigt)?
- c# - C# 字符串中的换行符
- module - 为模块中的每个子类型生成一个方法
- r - 正则表达式删除嵌套括号括号
- c++ - 动态选择要在 std::map 中使用的比较函子
- ios - UIPickerView 选择的第一个组件决定第二个组件的内容不同步
- python - 使用自定义 python 装饰器接受带有cherrypy 暴露端点的参数
- scala - spark sql:如何在组级别实现数据帧的并行处理,但是在每个组中,我们需要对行进行顺序处理
- sql - 无法重置分区组(特别是 Window 函数和 PostgreSQL)