Нетривиальный порядок в запросе QueryOver - PullRequest
3 голосов
/ 20 мая 2011

Я построил свой запрос с помощью QueryOver api ... теперь проблема в том, что мне нужно отсортировать его по некоторому специальному значению, которое нужно вычислить в полете ...

У меня есть мои продуктытаблица, и мне нужно отсортировать ее по расстоянию от некоторых конкретных координат .. эквивалент в SQL будет выглядеть как ORDER BY power(abs(p.x - @x),2) + power(abs(p.y - @y),2)

Теперь я понятия не имею, как написать его в запросе QueryOver .. какие-либо предложения?

Буду рад любой помощи!

1 Ответ

4 голосов
/ 22 мая 2011

Использование QueryOver - это небольшая проблема, потому что нам нужно использовать проекции при использовании функций SQL.

Я сбросил abs(...), потому что это не обязательно, так как x * x == -x * -x

Вариант 1: использование SqlProjection (не красиво, но короче)

int x = 10;
int y = 20;

var result = session.QueryOver<Product>()
    .OrderBy(Projections.SqlProjection(
        @"power(x - " + x.ToString() + ", 2) + power(y - " + y.ToString() + ", 2) as tmporder",
        new string[] { "test" }, 
        new NHibernate.Type.IType[] { NHibernateUtil.Int32 })).Asc
    .List();

Вариант 2: Использование SqlFunction - это длиннее и требует просмотра по ссылке ниже:

Примерно так (вам нужно включить OperatorProjection по ссылке; оно не завершено, и я его не тестировал)

.OrderBy(Projections.SqlFunction("power", NHibernateUtil.Double,
    new ArithmeticOperatorProjection("+", NHibernateUtil.Int32,
        Projections.Property<Product>(p => p.x), Projections.Constant(x)),
    Projections.Constant(2))).Asc

NHibernate и отсутствующий OperatorProjection Часть 1

...