将 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<Table>(x => x.ColumnName)
很好,但与流畅的语法相比不是很可读)
【问题讨论】:
【参考方案1】:如果您想在 OrmLite 中使用 SqlExpression<T>
执行 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