NHibernate调用PostgresSQL的SELECT DISTINCT ON()

时间:2009-11-25 19:20:56

标签: .net sql performance nhibernate postgresql

在提出这个问题之前,我已经搜索了一段时间,但找不到有关此主题的任何相关信息。

我的问题很简单:

我有NHibernate标准和投影,我正在尝试设置DISTINCT ON(列)

我的投影代码如下:

        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吗? 这个问题可以用NHibernate的方言解决吗?

期待您的反馈! 非常感谢你!

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但我想知道你是否可以通过使用“SQLProjection”来完成所需的工作?我是一个Java人,因此代码可能不完全正确,但以下方法看起来对我来说使用Postgres:

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

这会生成您在问题中提供的优化SQL查询。同样,如果您正在做一些高度动态的事情,这种方法可能无效,但它是解决问题的 A 方式。