【问题标题】:Use SELECT DISTINCT ON with OrmLite将 SELECT DISTINCT ON 与 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)} 很好,但与流畅的语法相比不是很可读)

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多