NHibernate QueryOver在属性或嵌套集合上的位置或

时间:2019-06-02 12:33:10

标签: c# nhibernate queryover

我有FooBar

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

1 个答案:

答案 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 ...这绝对是法律和业务领域模型的支持。