Question

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?

Was it helpful?

Solution

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

OTHER TIPS

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();

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top