FluentNHibernate; Как использовать QueryOver для наложения фильтра на объект подуровня? - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь понять, как получить граф объектов, где я хочу поместить фильтр на объект подуровня.Итак, учитывая ниже классы.Я хочу, чтобы запрос извлекал полную коллекцию A с их полными коллекциями B, но для коллекций C я хочу только извлечь элемент определенного диапазона дат, основываясь на свойстве time.

Я пытаюсь понять этот материал: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations

Возможно, это должно быть очевидно, но мне трудно понять, как использовать расширения для этого ограничения 3-го уровня.Так что был бы очень признателен за некоторую помощь

IQueryOver<A, B> q = session.QueryOver<A>()
    .JoinQueryOver<B>(a => a.Bs).JoinQueryOver<C>(b => b.Cs)
    .Where(e => e.time.Date == System.DateTime.UtcNow.Date);

Невозможно привести объект типа 'NHibernate.Criterion.QueryOver 2[A,C]' to type 'NHibernate.IQueryOver 2 [A, B]'.

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

, если приведенный выше ответ дает вам дубликаты, это потому, что это классическая проблема выбора n + 1. Смотри http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate

для способа эффективной загрузки этих коллекций без проблем с дублированием.

0 голосов
/ 16 августа 2011

Предполагая, что вы хотите привести результаты к списку в какой-то момент, я бы использовал:

session.QueryOver<A>()
.JoinQueryOver<B>(a => a.Bs)
.Fetch(a => a.Bs).Eager
.JoinQueryOver<C>(b => b.Cs)
.Where(e => e.time.Date == System.DateTime.UtcNow.Date).List<A>

Ключевой бит в том, что JoinQueryOver предназначен только для построения предложения where. Чтобы включить коллекции через активную загрузку, вам нужно использовать Fetch.

...