1

我正在尝试构建一个简单的查询,该查询使用 Dapper 按降序检索数据。如果这很重要,数据库是 MySql。

这是我使用的代码:

var builder = new SqlBuilder();

var sql = @$"SELECT * FROM table t /**orderby**/ LIMIT @paramSkip, @paramTake";

var template = builder.AddTemplate(sql);

builder.OrderBy("@paramOrderBy DESC", parameters: new
{
    paramOrderBy = orderBy,
});

// Limit
builder.AddParameters(parameters: new
{
    paramSkip = skip,
    paramTake = take
});

return Connection.QueryAsync<TableModel>(
template.RawSql, template.Parameters,
transaction: Transaction
);

这总是按升序返回数据。DESC 只是被忽略。我尝试在查询中使用 DESC 关键字或作为参数,但结果是相同的。

唯一有效的是将订单参数和 DESC 关键字放入查询本身(通过字符串插值)

(编辑:错别字和文字简化)

4

1 回答 1

3

您需要您的查询看起来像这样:

... ORDER BY <Column name> DESC ...

列名无法参数化,因此您需要将其插入到查询中,如下所示:

builder.OrderBy($"{orderBy} DESC");

如果您orderBy以任何方式来自用户,请务必先对其进行清理以防止 SQL 注入。您可以 - 例如 - 保留一个有效列名列表并针对它进行验证。

于 2020-06-03T12:52:39.767 回答