QueryOver apiを使用してクエリを作成しました...問題は、飛行中に計算する必要がある特別な値でクエリを並べ替える必要があることです...
製品テーブルがあり、特定の座標からの距離で並べ替える必要があります。SQLで同等のものは次のようになります。ORDER BY power(abs(p.x - @x),2) + power(abs(p.y - @y),2)
今、私はそれをQueryOverクエリで書く方法がわかりません..何か提案はありますか?
助けていただければ幸いです!
QueryOver apiを使用してクエリを作成しました...問題は、飛行中に計算する必要がある特別な値でクエリを並べ替える必要があることです...
製品テーブルがあり、特定の座標からの距離で並べ替える必要があります。SQLで同等のものは次のようになります。ORDER BY power(abs(p.x - @x),2) + power(abs(p.y - @y),2)
今、私はそれをQueryOverクエリで書く方法がわかりません..何か提案はありますか?
助けていただければ幸いです!
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