在 QueryOver 查询中不是简单的顺序

本文关键字:简单 顺序 QueryOver 查询 | 更新日期: 2023-09-27 17:56:59

我用QueryOver api构建了我的查询...现在的问题是我需要按一些需要在飞行中计算的特殊值对其进行排序......

我有我的产品表,我需要按与某些特定坐标的距离对其进行排序..等效的SQL看起来像ORDER BY power(abs(p.x - @x),2) + power(abs(p.y - @y),2)

现在我不知道如何在QueryOver查询中编写它..任何建议?

我会很高兴得到任何帮助!

在 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 - 这更长,需要查看下面的链接:

像这样的东西(你需要从链接中包含操作员投影;它不完整,我没有测试它)

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

NHibernate和缺失的操作员投影第1部分