Упорядочение по полям формул в NHibernate - PullRequest
4 голосов
/ 03 июня 2010

Предположим, у меня есть следующее отображение со свойством formula:

<class name="Planet" table="planets">
    <id name="Id" column="id">
        <generator class="native" />
    </id>

    <!-- somefunc() is a native SQL function -->
    <property name="Distance" formula="somefunc()" />
</class>

Я хотел бы получить все планеты и упорядочить их по Distance вычисленному свойству:

var planets = session
    .CreateCriteria<Planet>()
    .AddOrder(Order.Asc("Distance"))
    .List<Planet>();

Это переведено на следующий запрос:

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc()

Желаемый запрос:

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0

Если я устанавливаю проекцию с псевдонимом, она работает нормально:

var planets = session
    .CreateCriteria<Planet>()
    .SetProjection(Projections.Alias(Projections.Property("Distance"), "dist"))
    .AddOrder(Order.Asc("dist"))
    .List<Planet>();

SQL:

SELECT somefunc() as formula0 FROM planets ORDER BY formula0

, но он заполняет только свойство Distance в результате, и я действительно хотел бы избежать проецирования вручную поверх всех других свойств моего объекта (может быть много других свойств).

Это достижимо с помощью NHibernate? В качестве бонуса я хотел бы передать параметры нативной функции somefunc() SQL. Все, что создает желаемый SQL, является приемлемым (замена поля формулы на подвыборы и т. Д.), Важно иметь рассчитанное свойство Distance в результирующем объекте и порядок на это расстояние внутри SQL.

1 Ответ

4 голосов
/ 19 июня 2010

Эти 2 на 100% идентичны в SQL. Почему это важно?

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc()
SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0

Редактировать, все тот же:

Предложение ORDER BY просто повторяет вызов функции SELECT, с псевдонимом или нет

SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY somefunc(1, 'fish')
SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY formula0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...