Как вы работаете с отдельными экземплярами QueryOver? - PullRequest
8 голосов
/ 08 сентября 2011

Эта запись в блоге NHibernate отмечает, как можно создавать отдельные QueryOver запросы (аналогично DetachedCriteria) (используя QueryOver.Of<T>()). Однако, если посмотреть на это, это совсем не похоже на меня.

С DetachedCriteria я бы создал свой экземпляр и настроил его так, как мне нужно, а затем вызову GetExecutableCriteria(), чтобы затем назначить сеанс и выполнить запрос. При «отключенном» QueryOver большая часть API недоступна (т. Е. Для добавления ограничений, объединений, упорядочивания и т. Д.) До тех пор, пока я не вызову GetExecutableQueryOver, для чего требуется ISession или IStatelessSession, в этот момент вы больше не отключены.

Как вы работаете с отдельными QueryOver экземплярами?

EDIT:

Фактическая проблема была связана с тем, как я храню отдельный экземпляр QueryOver:

public class CriteriaQuery<T>
{
    internal protected QueryOver<T> _QueryOver { get; set; }

    public CriteriaQuery()
    {
        _QueryOver = QueryOver.Of<T>();
    }

    // Snip
}

Это должно быть QueryOver<T, T>.

1 Ответ

13 голосов
/ 08 сентября 2011

Я использую NHibernate 3.1.0.4000.Следующий код успешно компилируется:

Employee salesRepAlias = null;

var query = QueryOver.Of<Customer>()
    .JoinAlias(x => x.SalesRep, () => salesRepAlias)
    .Where(x => x.LastName == "Smith")
    .Where(() => salesRepAlias.Office.Id == 23)
    .OrderBy(x => x.LastName).Asc
    .ThenBy(x => x.FirstName).Asc;

return query.GetExecutableQueryOver(session)
    .List();

Это иллюстрирует использование ограничений, объединений и упорядочивание в отдельном QueryOver, как если бы вы использовали обычный.

Не могли бы вы опубликовать код, которыйдемонстрирует функции API, которые недоступны?

...