Давайте начнем с объявления псевдонимов, для последующего использования в запросах
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 ..., что является абсолютно законным и деловымподдержка модели домена.