.net NHibernate中按公式字段排序

.net NHibernate中按公式字段排序,.net,nhibernate,.net,Nhibernate,假设我有一个公式属性的以下映射: <class name="Planet" table="planets"> <id name="Id" column="id"> <generator class="native" /> </id> <!-- somefunc() is a native SQL function --> <property name="Distance" form

假设我有一个
公式
属性的以下映射:

<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>
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>();
但它只填充结果中的“距离”属性,我确实希望避免手动投影到对象的所有其他属性上(可能还有许多其他属性)


使用NHibernate是否可以实现这一目标?作为奖励,我想将参数传递给本机
somefunc()
SQL函数。生成所需SQL的任何内容都是可以接受的(用subselect等替换公式字段),重要的是在结果对象中具有计算距离属性,并在SQL中按此距离排序。

这两个属性在SQL中是100%相同的。为什么这很重要

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc()
SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0
编辑,仍然相同:

ORDERBY子句将简单地重复SELECT func调用,无论是否有别名

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

我只会使用投影…或者你需要实际的行星来进行进一步的操作吗?是的,投影可以工作,但是如果以后某个属性被添加到对象中,我也需要将其添加到投影中,如果我忘记了它将不会被分配。感谢提示,你是正确的,这些查询是100%相同的。现在,我如何将参数传递给OrderBy子句中的函数,因为我的函数需要参数?@Darin Dimitrov:我假设当您将参数传递给SELECT子句中的somefunc时,它们将以ORDER BY结尾。请看我的编辑。按不同的函数值排序是没有意义的,是吗?
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