Использование SetFetchMode - PullRequest
       15

Использование SetFetchMode

2 голосов
/ 20 июля 2011

Извините, мой любительский 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 (....), однако это никак не повлияет на то, что было получено.

1 Ответ

3 голосов
/ 20 июля 2011

в sql вы не можете фильтровать и получать все одновременно. Я еще не слишком разбираюсь в запросах, но вы должны понять.

var subquery = DetachedCriteria.For<Notification>()
    .CreateAlias("Parameters", "p", JoinType.InnerJoin)
    .Add(Restrictions.Where<Notification>(x => x.Acknowledged == false))
    .Add(Restrictions.In("p.PairHash", npHashes))
    .SetProjection(Projections.Id());

session.CreateCriteria<Notification>()
    .Add(Subqueries.PropertyIn("Id", subquery))
    .SetFetchMode("Parameters", FetchMode.Eager)
    .AddOrder(Order.Asc("DateCreated"))
    .List<Notification>();
...