我在我的项目中使用Dapper。我有一个SqlParameters列表,我想将它发送给Dapper。但是Dapper需要一个对象(名称,值)。如何将SqlParameter转换为对象。我知道这不起作用:
conn.Query<TModel>(sql, parameters.Select(p => new {p.ParameterName=p.Value}))
有什么建议吗?
答案 0 :(得分:12)
偶然发现了其他东西 - 但可以提供一些可能在将来帮助其他人的见解。
您可以使用Dapper.DynamicParameters对象添加可以合法传递给Dapper Queries的项目,即(手动编码)
var args = new DynamicParameters(new {});
parameters.ForEach(p => args.Add(p.ParameterName, p.Value));
conn.Query<TModel>(sql, args );
HTH
答案 1 :(得分:1)
此外,您还可以分配输入参数,数据类型,
的方向。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();
答案 2 :(得分:0)
希望这会节省一些时间。 我喜欢Majedur的答案,可以对进/出参数进行更多类似sql的控制。
简单易学的一课是Dapper的.Query <>()和.QueryAsync <>()方法确实采用了一个对象,它将转换为sql参数-需要注意几点:
可以使用匿名类型
new { Id = 100, Name = "name" }
其他定义的类型仅在其属性具有getter和setter的情况下才起作用:
public class MyArg
{
public long Id { get; set; }
public string Name { get; set; }
}
即不:
public class MyArg
{
public long Id;
public string Name;
}