20

I'm using Dapper and trying to retrieve a short from the database and would like to do this without grabbing it from a collection.

I've got the following code, which doesn't work because QueryAsync<short> returns IEnumerable<short>.

short status;
using (var sqlConnection = new SqlConnection(connectionString))
{
    var parameters = new DynamicParameters();
    parameters.Add("@ID", ID, DbType.Int32, ParameterDirection.Input);

    await sqlConnection.OpenAsync();
    status = await sqlConnection.QueryAsync<short>("SELECT [StatusID] FROM [MyTable] WHERE [ID] = @ID", parameters, commandTimeout: _sqlCommandTimeoutInSeconds);
}

Can I get Dapper to return a single value, instead of a collection?

Nic
  • 12,220
  • 20
  • 77
  • 105

3 Answers3

25

FYI, Dapper has now added both QuerySingle and QuerySingleAsync as well as their corresponding OrDefault variants... usage for QuerySingleOrDefaultAsync is:

await connection.QuerySingleOrDefaultAsync<short>(sql);
David Mohundro
  • 11,922
  • 5
  • 40
  • 44
15

Either you can use ExecuteScalarAsync or Single() with ExecuteScalarAsync you can retrieve a single value from database using Dapper.

short status;
using (var sqlConnection = new SqlConnection(connectionString))
{
  var parameters = new DynamicParameters();
  parameters.Add("@ID", ID, DbType.Int32, ParameterDirection.Input);

  await sqlConnection.OpenAsync();
  status = await sqlConnection.ExecuteScalarAsync<short>("SELECT [StatusID] FROM     [MyTable] WHERE [ID] = @ID", parameters, commandTimeout: _sqlCommandTimeoutInSeconds);
}

Single() can be used in this way

short status;
using (var sqlConnection = new SqlConnection(connectionString))
{
  var parameters = new DynamicParameters();
  parameters.Add("@ID", ID, DbType.Int32, ParameterDirection.Input);

  await sqlConnection.OpenAsync();
  status = await sqlConnection.QueryAsync<short>("SELECT [StatusID] FROM [MyTable] WHERE [ID] = @ID", parameters, commandTimeout: _sqlCommandTimeoutInSeconds).Single();
}
Nic
  • 12,220
  • 20
  • 77
  • 105
Aftab Ahmed
  • 1,727
  • 11
  • 15
2

You should use ExecuteScalar:

status = await sqlConnection.ExecuteScalarAsync<short>("SELECT [StatusID] FROM [MyTable] WHERE [ID] = @ID", parameters, commandTimeout: _sqlCommandTimeoutInSeconds)
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
Zein Makki
  • 29,485
  • 6
  • 52
  • 63