Pregunta

¿Hay alguna razón por la cual el siguiente código no se recuperaría en el orden correcto cuando se usa 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
                       });

Siempre regresa sin aplicar el pedido.

Podría simplemente colocar el orden de la orden y la dirección directamente en la cadena como esta

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

Pero no estoy seguro de cómo eso afectará a Dapper desde Creo que tiene su propio plan de consulta en caché.

Además, ¿hay alguna forma de ver la consulta generada por Dapper?

¿Fue útil?

Solución

Claro, en general, los motores de base de datos no le permiten parametrizar los nombres de las columnas. Así por ejemplo:

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

Cuando intenta parametrizar el orden por cláusulas, recomendaría usar la sustitución en línea, siempre que pueda garantizar que escape, las tablas de Bobby siempre están al acecho. (O eso o podrías usar un proceso)

No estoy seguro de la situación en torno a los perfiladores de (¿MySQL? Oracle?) Pero podría usar una herramienta como Miniprofiler Para ver el SQL.

Afectará el almacenamiento en caché, sin embargo, solo hay un pequeño número de permutaciones de orden de orden y dirección de clasificación, por lo que el impacto es mínimo.

Otros consejos

Puede usar una declaración de caso en su pedido por. Mientras solo se trate con algunas columnas, no se volverá demasiado loco.

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;
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top