将SqlParameter发送到Dapper

9

我在我的项目中使用Dapper。我有一个SqlParameter列表,我想将它发送给Dapper。但是Dapper需要一个对象(名称,值)。我该如何将SqlParameter转换为对象。我知道这行不通:

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

有什么建议吗?
3个回答

18

我本来在寻找其他东西时偶然发现了这个,但我可以提供一些见解,可能会对未来的其他人有所帮助。

您可以使用Dapper.DynamicParameters对象添加可合法传递给Dapper查询的项目,即(手动编码)

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

HTH


2
此外,您还可以指定输入参数的方向和数据类型。
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();

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接