Использование 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