【问题标题】:Dapper Order By小巧玲珑的订单
【发布时间】:2012-02-18 21:42:09
【问题描述】:

是否有任何原因导致使用 dapper 时无法以正确的顺序检索以下代码?

connection.Query<User>("SELECT id, name " +
                       "FROM user " +
                       "ORDER BY @sort @dir " +
                       "LIMIT @offset, @pageSize; ",
                       new {
                           sort = sortOrder, // sortOrder = "name"
                           dir = sortDirection, // sortDirection = "ASC"
                           offset = pageIndex * pageSize, // offset = 0
                           pageSize = pageSize // pageSize = 10
                       });

它总是返回而不应用排序。

我可以像这样直接将 sortOrder 和 sortDirection 放入字符串中

"SELECT id, name " +
"FROM user " +
"ORDER BY " + sortOrder + " " + sortDirection + " " +
"LIMIT @offset, @pageSize; "

但我不确定这将如何影响 dapper,因为 我相信它有自己的查询计划缓存

另外,有没有办法查看 dapper 生成的查询?

【问题讨论】:

    标签: sql-order-by dapper


    【解决方案1】:

    当然,一般数据库引擎不允许您对列名进行参数化。比如:

    var row = cnn.Query("select @bob as col from table", new {bob = "col"}).first(); 
    // most likely returns "row.col == col"
    

    当您尝试将 order by 子句参数化时,我建议您使用内联替换,前提是您可以保证您的转义,bobby 表总是潜伏着。 (或者你可以使用一个过程)

    我不确定(MySQL?Oracle?)的分析器周围的情况,但您可以使用像MiniProfiler 这样的工具来查看SQL。

    它会影响缓存,但是 sortOrder 和 sortDirection 的排列很少,因此影响很小。

    【讨论】:

    【解决方案2】:

    您可以在 order by 中使用 case 语句。只要你只处理几列,就不会太疯狂。

    public List<Signup> GetNext(int Id, int RowsToFetch, string SortedBy)
            {
    
                string _sortedBy = SortedBy.Trim();
                using (IDbConnection conn = Connection)
                {
                    string sQuery = @"SELECT TOP(@ROWSTOFETCH)
                                        [Id]
                                       ,[FirstName]
                                       ,[LastName]
                                       ,[EmailAddress]
                                      FROM [dbo].[vwBaseQuery]
                                      WHERE ID >= @ID
                                      ORDER BY 
                                              CASE WHEN @SORTEDBY = 'Id ASC' THEN Id END ASC,
                                              CASE WHEN @SORTEDBY = 'Id DESC' THEN Id END DESC,
                                              CASE WHEN @SORTEDBY = 'FirstName ASC' THEN FirstName END ASC,
                                              CASE WHEN @SORTEDBY = 'FirstName DESC' THEN FirstName END DESC,
                                              CASE WHEN @SORTEDBY = 'LastName ASC' THEN LastName END ASC,
                                              CASE WHEN @SORTEDBY = 'LastName DESC' THEN LastName END DESC,
                                              CASE WHEN @SORTEDBY = 'EmailAddress ASC' THEN EmailAddress END ASC,
                                              CASE WHEN @SORTEDBY = 'EmailAddress DESC' THEN EmailAddress END DESC";
                    conn.Open();
    
                    var result = conn.Query<Signup>(sQuery, new {
                        SORTEDBY = _sortedBy,
                        ROWSTOFETCH = RowsToFetch,
                        ID = Id
                    }).ToList();
                    return result;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多