将 SELECT DISTINCT ON 与 OrmLite 一起使用

Posted

技术标签:

【中文标题】将 SELECT DISTINCT ON 与 OrmLite 一起使用【英文标题】:Use SELECT DISTINCT ON with OrmLite 【发布时间】:2021-11-18 16:30:18 【问题描述】:

我尝试编写此代码以使用SELECT DISTINCT ON

            var q = Db.From<WatchedUrlScanResult>();
            q.Join<WatchedUrlRecord>()
                .Where<WatchedUrlRecord>(x => x.TargetDomainRecordId == request.TargetDomainId)
                .And(x => x.ScanDate < fromEnd)
                .OrderBy(x => x.WatchedUrlRecordId)
                .OrderByDescending(x => x.ScanDate);

            q.SelectExpression = q.SelectExpression.Replace("SELECT",
                    $"SELECT DISTINCT ON (q.Column<WatchedUrlScanResult>(x => x.WatchedUrlRecordId))");

            var fromSnapshot = Db.Select<WatchedUrlScanResult>(q);

在调试器中,它显示为SelectExpression 设置的值,但实际运行的SQL 只是SELECT,没有DISTINCT ON

我试过了:

q.Select(q.SelectExpression.Replace("SELECT",
                    $"SELECT DISTINCT ON (q.Column<WatchedUrlScanResult>(x => x.WatchedUrlRecordId))"));

但我明白了:

检测到潜在的非法片段

是否可以在不将完整查询变为字符串的情况下执行此操作? (在完整的字符串查询中使用q.Column&lt;Table&gt;(x =&gt; x.ColumnName) 很好,但与流畅的语法相比不是很可读)

【问题讨论】:

【参考方案1】:

如果您想在 OrmLite 中使用 SqlExpression&lt;T&gt; 执行 SELECT DISTINCT 查询,您可以使用 SelectDistinct() API,例如:

var results = Db.Select(q.SelectDistinct());

但当您尝试执行自己的自定义 SQL 不同查询时,您需要使用 Custom SQL APIs,例如:

var sql = q.ToSelectStatement().Replace(what,with);
var results = Db.SqlList<WatchedUrlScanResult>(sql);

【讨论】:

以上是关于将 SELECT DISTINCT ON 与 OrmLite 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在不使用子查询的情况下使用 SELECT DISTINCT ON 计算总行数

sql SQL SELECT,DISTINCT,WHERE。运算符:AND,OR,ORDER BY。取自http://www.w3schools.com/sql/sql_select.asp

Postgres DISTINCT 与 DISTINCT ON 有啥区别?

SQL 性能:SELECT DISTINCT 与 GROUP BY

如何在 python 代码中添加 mysql 查询 select distinct?

第二十九章 SQL命令 DISTINCT