使用 Dapper.Contrib 和 InsertAsync 编写通用 InsertData 方法
Writing a generic InsertData method using Dapper.Contrib and InsertAsync
我对 C# 和 Dapper 还很陌生。我正在尝试为我的项目编写一个通用的插入数据方法。我来自 Delphi 环境,所以我仍在寻找 C# 的出路。
Dapper 使用起来似乎相当简单,但我遇到了一些挑战。我已经尝试了各种方法来使用以下代码获得正确的语法,但都没有成功。
问题似乎围绕着 T(我仍然不太明白 T 是什么)以及我拥有的所有组合试过不行。
public async Task<int> InsertData<T>(T list)
{
string connectionString = _config.GetConnectionString(ConnectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
return await connection.InsertAsync<int>(list);
}
}
以下代码确实有效,那么我哪里出错了?
public async Task SaveData<T>(string sql, T parameters)
{
string connectionString = _config.GetConnectionString(ConnectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
await connection.ExecuteAsync(sql, parameters);
}
}
您的第二个代码 (await connection.ExecuteAsync(sql, parameters);
) 有效,因为您只是在执行您手写的 SQL 语句。方法ExecuteAsync
属于Dapper;不是 Dapper.Contrib。通用 T
用于 parameters
,不适用于您要插入的对象。
对于您的第一个代码 (return await connection.InsertAsync<int>(list);
),您实际上使用的是 Dapper.Contrib;您不是手写 SQL 语句。 Dapper.Contrib 为您生成。
您的以下代码似乎是问题所在:
return await connection.InsertAsync<int>(list);
您正在将通用参数 <int>
传递给没有意义的方法。
我还没有对此进行测试,但我希望将该行更改为以下行应该可行:
return await connection.InsertAsync<T>(list);
此外,您必须通过向其添加 where T : class
来确保通用类型 T
是 class。
以下通用方法应该符合您的目的;您需要将其转换为 async
以匹配您当前的代码:
public void InsertData<T>(T entity) where T : class
{
string connectionString = ....;
using(IDbConnection connection = new SqlConnection(connectionString))
{
long result = connection.Insert<T>(entity);
}
}
我不理解你代码中的其他几个部分。说 InsertData<T>(T list)
。什么是 list
?它是作为单个对象还是对象列表?如果它是对象列表,List<T> list
更有意义。如果它是单个对象,最好将 list
重命名为实际对象名称,例如 T customer/entity/poco
等
我对 C# 和 Dapper 还很陌生。我正在尝试为我的项目编写一个通用的插入数据方法。我来自 Delphi 环境,所以我仍在寻找 C# 的出路。
Dapper 使用起来似乎相当简单,但我遇到了一些挑战。我已经尝试了各种方法来使用以下代码获得正确的语法,但都没有成功。
问题似乎围绕着 T(我仍然不太明白 T 是什么)以及我拥有的所有组合试过不行。
public async Task<int> InsertData<T>(T list)
{
string connectionString = _config.GetConnectionString(ConnectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
return await connection.InsertAsync<int>(list);
}
}
以下代码确实有效,那么我哪里出错了?
public async Task SaveData<T>(string sql, T parameters)
{
string connectionString = _config.GetConnectionString(ConnectionStringName);
using (IDbConnection connection = new SqlConnection(connectionString))
{
await connection.ExecuteAsync(sql, parameters);
}
}
您的第二个代码 (await connection.ExecuteAsync(sql, parameters);
) 有效,因为您只是在执行您手写的 SQL 语句。方法ExecuteAsync
属于Dapper;不是 Dapper.Contrib。通用 T
用于 parameters
,不适用于您要插入的对象。
对于您的第一个代码 (return await connection.InsertAsync<int>(list);
),您实际上使用的是 Dapper.Contrib;您不是手写 SQL 语句。 Dapper.Contrib 为您生成。
您的以下代码似乎是问题所在:
return await connection.InsertAsync<int>(list);
您正在将通用参数 <int>
传递给没有意义的方法。
我还没有对此进行测试,但我希望将该行更改为以下行应该可行:
return await connection.InsertAsync<T>(list);
此外,您必须通过向其添加 where T : class
来确保通用类型 T
是 class。
以下通用方法应该符合您的目的;您需要将其转换为 async
以匹配您当前的代码:
public void InsertData<T>(T entity) where T : class
{
string connectionString = ....;
using(IDbConnection connection = new SqlConnection(connectionString))
{
long result = connection.Insert<T>(entity);
}
}
我不理解你代码中的其他几个部分。说 InsertData<T>(T list)
。什么是 list
?它是作为单个对象还是对象列表?如果它是对象列表,List<T> list
更有意义。如果它是单个对象,最好将 list
重命名为实际对象名称,例如 T customer/entity/poco
等