Cómo almacenar un resultado sql a una variable en C # usando Dapper.NET

c# dapper sqlconnection

Pregunta

Estoy usando en mi proyecto, una hermosa herramienta para almacenar los resultados de las SQL query en una List y esto funciona bien.

Escribí una SQL query para recuperar un registro de la base de datos y almacenar el resultado en una variable, intenté usar dapper pero me quedé pegado con un error. He pegado el código correspondiente.

Excepción: no se puede convertir el objeto del tipo 'System.Collections.Generic.List`1 [Dapper.SqlMapper + DapperRow]' a 'System.IConvertible'.

try
{
  using(var connection = ...)
  {
   connection.Open();
   const string masterSelectQuery = "SELECT Id as [fileId], FileName as [fileName], Frequency as [frequency], Scheduled_Time as scheduledTime FROM MASTER_TABLE";
   masterTableList = connection.Query<MasterTableAttributes>(masterSelectQuery).ToList();//Working fine

   const string lastProcessedTimeQuery = "SELECT TOP 1 file_transfered_time as [lastProcessedTime] FROM PROCESS_LOGS ORDER BY file_transfered_time DESC";
   DateTime lastProcessedTime = Convert.ToDateTime(connection.Query(lastProcessedTimeQuery)); //Here it fails
  }    
}

Para superar este error, utilicé SQLCommand siguiente manera

using (command = new SqlCommand(lastProcessedTimeQuery, connection))
{
  DateTime lastProcessedTime = (DateTime)command.ExecuteScalar();//working fine  
}

Estoy cometiendo un error al usar apuesto, ¿alguien puede guiarme?

Gracias por adelantado.

Respuesta aceptada

connection.Query(lastProcessedTimeQuery) devuelve una secuencia de filas , cada una individualmente dynamic . Suponiendo que file_transfered_time es una datetime y datetime , tiene dos opciones aquí:

DateTime lastProcessedTime = connection.Query<DateTime>(
                 lastProcessedTimeQuery).Single();

o, para mostrar cómo no genérico Query funciona con una dynamic consecutivas:

DateTime lastProcessedTime = connection.Query(
                 lastProcessedTimeQuery).Single().lastProcessedTime;

Si su tabla PROCESS_LOGS alguna vez puede estar vacía, puede preferir SingleOrDefault :

DateTime? lastProcessedTime = connection.Query<DateTime?>(
                 lastProcessedTimeQuery).SingleOrDefault();

o:

var row = connection.Query(lastProcessedTimeQuery).SingleOrDefault();
DateTime? lastProcessedTime = null;
if(row != null) lastProcessedTime = row.lastProcessedTime;


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow