在提出这个问题之前,我已经搜索了一段时间,但找不到有关此主题的任何相关信息。
我的问题很简单:
我有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的方言解决吗?
期待您的反馈! 非常感谢你!
答案 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 方式。