Как сохранить результат sql в переменной на C # с помощью Dapper.NET

c# dapper sqlconnection

Вопрос

Я использую в своем проекте, прекрасный инструмент для хранения результатов SQL query в List и это работает хорошо.

Я написал SQL query для извлечения записи из базы данных и сохранения результата в переменной, я попытался использовать dapper, но застрял с ошибкой. Я вставил соответствующий код.

Исключение: невозможно лить объект типа «System.Collections.Generic.List`1 [Dapper.SqlMapper + DapperRow]» для ввода «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
  }    
}

Чтобы преодолеть эту ошибку, я использовал SQLCommand следующим образом

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

Я ошибаюсь в использовании dapper, может ли кто-нибудь направить меня?

Заранее спасибо.

Принятый ответ

connection.Query(lastProcessedTimeQuery) возвращает последовательность строк , каждая из которых индивидуально dynamic . Предполагая, что file_transfered_time - это datetime , у вас есть два варианта:

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

или, чтобы показать, как не общий Query работает с dynamic строкой:

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

Если ваша таблица PROCESS_LOGS может быть пуста, вы можете предпочесть SingleOrDefault :

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

или:

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему