【问题标题】:Passing variable into ORDER BY sql statement [duplicate]将变量传递给 ORDER BY sql 语句[重复]
【发布时间】:2021-09-28 23:24:45
【问题描述】:

我正在尝试编写一个查询,其中将“排序”变量传递到 ORDER BY 语句中,并收到以下错误:

由 ORDER BY 编号 1 标识的 SELECT 项包含一个变量,作为标识列位置的表达式的一部分。只有在通过引用列名的表达式进行排序时才允许使用变量。

以下代码是我将变量传递给ORDER BY 子句并传入值的地方。

public async Task<IEnumerable<Export>> GetUserExports(Guid userId, ExportsListsSortType sort)
{
    var selectQuery = "SELECT * FROM [dbo].[Exports]" \r\n 
    selectQuery += " WHERE [UserId] = @UserId \r\n";     
    selectQuery += " ORDER BY @Sort  \r\n ";
       
    return await conn.QueryAsync<Export>selectQuery, new { Sort = GetSortColumn((ExportsListsSortType)sort) });
}

以下代码显示了GetSortColumn 方法,该方法根据传入的排序确定要排序的列:

public string GetSortColumn(ExportsListsSortType sort)
{
    switch(sort)
    {
        case (ExportsListsSortType.RunDateAsc):
            return "CreateDate ASC";

        case (ExportsListsSortType.RunDateDesc):
            return "CreateDate DESC";

        case (ExportsListsSortType.TemplateNameAsc):
            return "ReportTitle ASC";

        case (ExportsListsSortType.TemplateNameDesc):
            return "ReportTitle DESC";

        default:
            return " CreateDate DESC";
    }       
}

我意识到将变量传递到 ORDER BY 子句可能会变得很棘手,并且似乎无法弄清楚这一点。

我怎样才能做到这一点?

【问题讨论】:

  • 不带参数(至少不带大多数 SQL 引擎。您必须动态构建 SQL 语句。但不要放弃参数 - 只需注入 WHERE 列(使用适当的 SQL-注入预防技术)并继续为WHERE 子句使用参数

标签: c# sql variables sql-order-by


【解决方案1】:

不要将其作为参数传入,在查询执行后对 IEnumerable 应用 order by。 IE:这是你的返回值:

var result = GetUserExports(1002);
result.OrderBy(GetSortColumn(ExportsListsSortType.RunDateAsc));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2013-07-15
    • 1970-01-01
    • 2015-08-08
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多