Извините, мой любительский nhibernate-ness, но я борюсь с извлечением в следующем сценарии.
var query = session.CreateCriteria<Notification>().SetFetchMode("Parameters", FetchMode.Select)
.CreateAlias("Parameters", "p", JoinType.InnerJoin)
.Add(Restrictions.Where<Notification>(x => x.Acknowledged == false));
[некоторый код, который создает IList под названием npHashes]
query = query.Add(Restrictions.In("p.PairHash", npHashes)).AddOrder(new Order("DateCreated", false));
[перечислить это]
Обратите внимание, что я использую SELECT в качестве режима prefetchmode ... параметр, который, очевидно, остался вне QueryOver ... и LINQ ... Также обратите внимание, что выбранная таблица - это та же таблица, к которой я присоединился для фильтрации по .
Выполнение этого запроса приводит к следующему:
SELECT
this_.Id as Id14_1_,
this_.Version as Version14_1_,
this_.Url as Url14_1_,
this_.DispatchType as Dispatch5_14_1_,
this_.Acknowledged as Acknowle6_14_1_,
this_.DateCreated as DateCrea7_14_1_,
this_.NotificationType as Notifica2_14_1_,
p1_.Id as Id15_0_,
p1_.Version as Version15_0_,
p1_.NotificationId as Notifica3_15_0_,
p1_.Name as Name15_0_,
p1_.Value as Value15_0_,
p1_.PairHash as PairHash15_0_
FROM
Notification this_
inner join
NotificationParameter p1_
on this_.Id=p1_.NotificationId
WHERE
this_.Acknowledged = ?p0
and p1_.PairHash in (
?p1
)
ORDER BY
this_.DateCreated desc;
?p0 = False [Type: Boolean (0)],
?p1 = 'V3zmXnv12B3AC26xeG10w+bas4U=' [Type: String (28)]
Таким образом, первая проблема по какой-то причине - столбцы NotificationParameter включены в список выбора ... похоже, что выборочная выборка не выполняется. Это плохо, потому что а) я хочу выбрать выборку б) записи выборки фильтруются. Извлечение - это не то же самое, что объединение (как концепция), и фильтры в соединенных данных не должны (в этом случае) фильтровать то, что я получаю.
Второй проблемой, конечно же, является то, что выборка SELECT не произошла. Вместо этого при первом обращении к свойству Parameters свойства Notification они загружаются лениво: O
Любая помощь? Также, если есть способ сделать это с помощью QueryOver, я бы предпочел это. Я заметил, что могу пойти .UnderlyingCriteria.SetFetchmode (....), однако это никак не повлияет на то, что было получено.