.net NHibernate在()上调用PostgresSQL的SELECT DISTINCT

.net NHibernate在()上调用PostgresSQL的SELECT DISTINCT,.net,sql,performance,nhibernate,postgresql,.net,Sql,Performance,Nhibernate,Postgresql,在问这个问题之前,我在谷歌上搜索了一段时间,但找不到关于这个话题的任何相关信息 我的问题很简单: 我有NHibernate标准和投影,我试图设置不同的ONcolumn 我的投影代码如下: criteria.SetProjection( Projections.ProjectionList() .Add(Projections.Distinct(Projections.Property("ID"))) .Add

在问这个问题之前,我在谷歌上搜索了一段时间,但找不到关于这个话题的任何相关信息

我的问题很简单:

我有NHibernate标准和投影,我试图设置不同的ONcolumn

我的投影代码如下:

        criteria.SetProjection(
            Projections.ProjectionList()
            .Add(Projections.Distinct(Projections.Property("ID")))
            .Add(Projections.Property("A"))
            .Add(Projections.Property("B"))
         );
这将生成以下SQL位简化:

SELECT DISTINCT ID, A, B FROM ABC ORDER BY A
但不幸的是,如果这个查询非常差,那么性能会非常差

我优化了SQL,使其运行速度更快,如下所示:

SELECT DISTINCT ON (A) ID, A, B FROM ABC ORDER BY A
我是否可以让NHibernate生成刚才显示的SQL? 这个问题可以用尼伯内特的方言解决吗

期待您的反馈!
多谢各位

无论如何,这不是最优雅的解决方案,但我想知道您是否可以通过使用SQLProjection来实现所需的功能?我是一个Java爱好者,因此代码可能不完全正确,但以下方法似乎适合我使用Postgres:

criteria.SetProjection(
    Projections.ProjectionList()
    .Add(Projections.SqlProjection("DISTINCT ON(A) ID"))
    .Add(Projections.Property("A"))
    .Add(Projections.Property("B"))
 );

这将生成您在问题中给出的优化SQL查询。同样,如果您正在做一些高度动态的事情,这种方法可能不起作用,但它是解决问题的一种方法。

无论如何,这不是最优雅的解决方案,但我想知道您是否可以通过使用SQLProjection来完成所需的任务?我是一个Java爱好者,因此代码可能不完全正确,但以下方法似乎适合我使用Postgres:

criteria.SetProjection(
    Projections.ProjectionList()
    .Add(Projections.SqlProjection("DISTINCT ON(A) ID"))
    .Add(Projections.Property("A"))
    .Add(Projections.Property("B"))
 );
这将生成您在问题中给出的优化SQL查询。同样,如果您正在做一些高度动态的事情,这种方法可能不起作用,但它是解决问题的一种方法