我对使用Dapper很感兴趣--但据我所知,它只支持查询和执行。我没有看到Dapper包含一种插入和更新对象的方法。
考虑到我们的项目(大多数项目?)需要做插入和更新,在dapper旁边做插入和更新的最佳实践是什么?
优选地,我们不必求助于参数构建的ADO.NET方法,等等。
在这一点上,我能想到的最好的答案是使用LinqToSQL进行插入和更新。有没有更好的答案?
发布于 2011-07-05 15:17:57
你可以这样做:
sqlConnection.Open();
string sqlQuery = "INSERT INTO [dbo].[Customer]([FirstName],[LastName],[Address],[City]) VALUES (@FirstName,@LastName,@Address,@City)";
sqlConnection.Execute(sqlQuery,
new
{
customerEntity.FirstName,
customerEntity.LastName,
customerEntity.Address,
customerEntity.City
});
sqlConnection.Close();
发布于 2017-04-25 04:02:04
使用Dapper.Contrib就像这样简单:
插入列表:
public int Insert(IEnumerable<YourClass> yourClass)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Insert(yourClass) ;
}
}
插入单个:
public int Insert(YourClass yourClass)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Insert(yourClass) ;
}
}
更新列表:
public bool Update(IEnumerable<YourClass> yourClass)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Update(yourClass) ;
}
}
更新单个:
public bool Update(YourClass yourClass)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Update(yourClass) ;
}
}
来源:https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib
发布于 2020-07-06 13:48:36
与其使用任何第三方库进行查询操作,我宁愿建议您自己编写查询。因为使用任何其他第三方包都会失去使用dapper的主要优势,即编写查询的灵活性。
现在,为整个对象编写Insert或Update查询存在问题。为此,可以简单地创建助手,如下所示:
InsertQueryBuilder:
public static string InsertQueryBuilder(IEnumerable < string > fields) {
StringBuilder columns = new StringBuilder();
StringBuilder values = new StringBuilder();
foreach(string columnName in fields) {
columns.Append($ "{columnName}, ");
values.Append($ "@{columnName}, ");
}
string insertQuery = $ "({ columns.ToString().TrimEnd(',', ' ')}) VALUES ({ values.ToString().TrimEnd(',', ' ')}) ";
return insertQuery;
}
现在,只需传递要插入的列的名称,整个查询就会自动创建,如下所示:
List < string > columns = new List < string > {
"UserName",
"City"
}
//QueryBuilder is the class having the InsertQueryBuilder()
string insertQueryValues = QueryBuilderUtil.InsertQueryBuilder(columns);
string insertQuery = $ "INSERT INTO UserDetails {insertQueryValues} RETURNING UserId";
Guid insertedId = await _connection.ExecuteScalarAsync < Guid > (insertQuery, userObj);
您还可以通过传递TableName参数来修改函数以返回整个INSERT语句。
确保Class属性名称与数据库中的字段名称匹配。然后,只有你可以传递整个obj (就像我们例子中的userObj ),值将被自动映射。
同样,您也可以使用用于更新查询的helper函数:
public static string UpdateQueryBuilder(List < string > fields) {
StringBuilder updateQueryBuilder = new StringBuilder();
foreach(string columnName in fields) {
updateQueryBuilder.AppendFormat("{0}=@{0}, ", columnName);
}
return updateQueryBuilder.ToString().TrimEnd(',', ' ');
}
并像这样使用它:
List < string > columns = new List < string > {
"UserName",
"City"
}
//QueryBuilder is the class having the UpdateQueryBuilder()
string updateQueryValues = QueryBuilderUtil.UpdateQueryBuilder(columns);
string updateQuery = $"UPDATE UserDetails SET {updateQueryValues} WHERE UserId=@UserId";
await _connection.ExecuteAsync(updateQuery, userObj);
尽管在这些帮助器函数中,您还需要传递要插入或更新的字段的名称,但至少您可以完全控制查询,并且还可以在需要时包含不同的WHERE子句。
通过此辅助函数,您将保存以下代码行:
对于插入查询:
$ "INSERT INTO UserDetails (UserName,City) VALUES (@UserName,@City) RETURNING UserId";
对于更新查询:
$"UPDATE UserDetails SET UserName=@UserName, City=@City WHERE UserId=@UserId";
似乎只有几行代码不同,但是当涉及到对具有10个以上字段的表执行插入或更新操作时,人们可以感觉到不同。
您可以使用nameof运算符在函数中传递字段名,以避免输入错误
而不是:
List < string > columns = new List < string > {
"UserName",
"City"
}
你可以这样写:
List < string > columns = new List < string > {
nameof(UserEntity.UserName),
nameof(UserEntity.City),
}
https://stackoverflow.com/questions/5957774
复制相似问题