我有Foo
和Bar
类
class Foo {
string Name;
IList<Bar> Bars;
}
class Bar {
string Name;
}
我有一个输入q
,并且我想编写一个NHibernate查询,如果Foo
包含Foo.Name
或任何{{1 }}个对象的q
包含Bars
。
我知道如何进行单独的查询,但是我不确定如何使用Name
运算符将其合并为1。基本上,如果q
对象的名称或任何OR
名称中包含Foo
,我希望q
对象出现在输出中。
Bars
Foo
答案 0 :(得分:1)
让我们从声明别名开始,以便以后在查询中使用
Foo foo = null;
Bar bar = null;
现在的第一种方法是加入集合(并得到丑陋的结果,每个匹配的子代都有成倍的父代)
.QueryOver<Foo>(() => foo)
.JoinQueryOver<Bar>(x => x.Occupations, () => bar)
.Where(x => foo.Name.IsInsensitiveLike(q)
|| bar.Name.IsInsensitiveLike(q))
这将起作用,但如果有更多匹配的子项Foo
...,则可能返回一些重复父项Bar
的行...
Foo1, Bar1
Foo1, Bar2
要仅获取干净的父级结果集,我们需要将JOIN替换为子查询
.QueryOver<Foo>(() => foo)
.Where(Restrictions
.Or(
Restrictions.Where(() => foo.Name.IsInsensitiveLike(q)),
Subqueries
.WhereProperty(() => foo.ID)
.In(QueryOver.Of<Bar>(() => bar)
.Where(() => bar.Name.IsInsensitiveLike(q))
.Select(y => bar.Foo.ID)
)
)
)
这也希望子Bar可以追溯到Foo ...这绝对是法律和业务领域模型的支持。