Mahmood Dehghan
Mahmood Dehghan

Reputation: 8265

Send SqlParameter to Dapper

I' using Dapper in my project. I have a list of SqlParameters and I want to send it to Dapper. But Dapper needs an object (name, value). How can I convert a SqlParameter to an object. I know this doesn't work:

conn.Query<TModel>(sql, parameters.Select(p => new {p.ParameterName=p.Value}))

any suggestions?

Upvotes: 10

Views: 10168

Answers (3)

Majedur
Majedur

Reputation: 3242

In addition You can also assign direction of your input parameters, data types,

var parameters = new DynamicParameters();
parameters.Add(name: "@UserId", value: obj.DriverId, dbType: DbType.String, direction: ParameterDirection.Input);
parameters.Add(name: "@Password", value: obj.DPassword, dbType: DbType.String, direction: ParameterDirection.Input);
parameters.Add(name: "@IMEINo", value: obj.IMEINo, dbType: DbType.String, direction: ParameterDirection.Input);
return DatabaseHub.Query<object>(storedProcedureName: @"[dbo].[sp_m_GetAppLoginCheckData]", parameters: parameters, dbName: AMSDB).FirstOrDefault();

Upvotes: 2

darksider474
darksider474

Reputation: 1000

Hopefully this will save someone time. I like Majedur's answer for more sql-like control over in/out params.

The quick and easy lesson is that Dapper's .Query<>() and .QueryAsync<>() methods do take an object that it will convert to sql parameters - with a few points to note:

Anonymous types are fine:

new { Id = 100, Name = "name" }

Other defined types will only work if their properties have getters and setters:

public class MyArg
{
    public long Id { get; set; }
    public string Name { get; set; }
}

i.e. NOT:

public class MyArg
{
    public long Id;
    public string Name;
}

Upvotes: 0

SeanCocteau
SeanCocteau

Reputation: 1876

Stumbled across this looking for something else - but can offer some insight that may help others in the future.

You can use the Dapper.DynamicParameters object to add items that can be legally passed to Dapper Queries, i.e. (hand-coded)

var args = new DynamicParameters(new {});
parameters.ForEach(p => args.Add(p.ParameterName, p.Value));
conn.Query<TModel>(sql, args );

HTH

Upvotes: 19

Related Questions