Как заказать запрос NHibernate 3.0 Linq на основе предоставленного имени свойства - PullRequest
3 голосов
/ 20 января 2011

Я пытаюсь упорядочить свой запрос NHibernate 3.0 Linq динамически на основе имени столбца, хранящегося в строковой переменной.

// The value of this variable can be the name of any property of Document.
string columnName = "column1";

var query = from n in Session.Query<Document>()
            where n.DocumentNumber == documentNumber
            // how to order by the value of columnName?
            select n;

Ключевое слово orderby принимает строку (или переменную), нокогда я выполняю следующее:

var query = from n in Session.Query<Document>()
            where n.DocumentNumber == documentNumber
            orderby columnName
            select n;

Я получаю это исключение:

не удалось выполнить запрос

select TOP (@p0)
  accumulate0_.Id as Id9_, 
  accumulate0_.DocumentNumber as Documen10_9_
from dbo.Documents accumulate0_
where
  accumulate0_.DocumentNumber=@p1
order by @p2 desc

SELECTЭлемент, идентифицируемый номером 1 ORDER BY, содержит переменную как часть выражения, идентифицирующую позицию столбца.Переменные разрешены только при упорядочении по выражению, ссылающемуся на имя столбца.

Я знаю, что есть Библиотека динамических запросов LINQ , которая обеспечивает перегрузку метода расширения .OrderBy, который принимаетстрока , но это, очевидно, работает только в памяти .Однако при использовании NHibernate 3.0 возникает исключение.

Я пытаюсь, чтобы в операторе ORDER BY в сгенерированном запросе SQL было указано соответствующее имя столбца, поэтому мне нужно остаться в области NHibernate.

Используя критерии NHibernate, я могу заказать динамически, но, поскольку я использую NHibernate Linq, у меня нет доступа к функциям критериев.

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Динамический LINQ работает с любым источником, а не только в памяти.

Это то, что мы используем сейчас.

1 голос
/ 20 января 2011

но так как я использую NHibernate Linq, у меня нет доступа к функциям критериев.

Конечно Session.должен вызвать CreateCriteria?NHibernate Linq и CreateCriteria должны жить вместе гораздо счастливее.

Не уверен, возможно ли использование только linq, также я не думаю, что это возможно с помощью QueryOver, но одним из способов может быть использование CreateCriteria, как вы указали.

var query = Session
    .CreateCriteria<Document>()
    .Add(Restrictions.Eq("DocumentNumber", documentNumber))
    .AddOrder(Order.Asc("column1"))
    .List<Document>();

Другой способ - использовать HQL.

...