C# 我可以使用Dapper中的查询方法插入和更新行吗?
我试图找出是否可以在Dapper中使用Query方法来插入和更新行,因为我想在应用插入和更新操作后返回一个对象 我找不到任何值得注意的答案,所以我只是尝试:C# 我可以使用Dapper中的查询方法插入和更新行吗?,c#,asp.net-core,asp.net-core-webapi,dapper,C#,Asp.net Core,Asp.net Core Webapi,Dapper,我试图找出是否可以在Dapper中使用Query方法来插入和更新行,因为我想在应用插入和更新操作后返回一个对象 我找不到任何值得注意的答案,所以我只是尝试: public async Task<Hotel> CreateHotel(Hotel hotel) { var sql = "INSERT INTO Hotels" + " (name, city)" +
public async Task<Hotel> CreateHotel(Hotel hotel)
{
var sql = "INSERT INTO Hotels" +
" (name, city)" +
" VALUES (@name, @city)";
var newHotel = new Hotel()
{
Name = hotel.Name,
City = hotel.City
};
using (var connection = new SqlConnection(CONNECTION_STRING))
{
return (Hotel)await connection.QueryAsync<Hotel>(sql, newHotel);
}
}
公共异步任务CreateHotel(Hotel)
{
var sql=“插入酒店”+
(姓名、城市)+
“价值观(@name,@city)”;
var newHotel=新酒店()
{
Name=酒店。Name,
城市=酒店。城市
};
使用(var连接=新的SqlConnection(连接\字符串))
{
返回(酒店)等待连接;
}
}
但这会导致错误:System.InvalidCastException:无法将类型为“System.Linq.EmptyPartition1[HotelFinder.Entities.Hotel]”的对象强制转换为类型为“System.Collections.Generic.List
1[HotelFinder.Entities.Hotel]”
您知道如何解决这个问题还是完全错误吗?首先,您需要使用
OUTPUT
子句从insert语句返回行
其次,QueryAsync
将返回一个IEnumerable
,而不是Hotel
,因此您将无法对其进行强制转换
放在一起,看起来是这样的
公共异步任务CreateHotel(Hotel)
{
var sql=“插入酒店”+
(姓名、城市)+
输出inserted.name,inserted.city+
“价值观(@name,@city)”;
var newHotel=新酒店()
{
Name=酒店。Name,
城市=酒店。城市
};
使用(var连接=新的SqlConnection(连接\字符串))
{
return(wait connection.QueryAsync(sql,newHotel)).SingleOrDefault();
}
}
您使用的是什么RDBMS?insert语句不返回任何行,因此需要修改查询以返回新插入的行。如何做到这一点可能因服务器而异。另外,QueryAsync
返回一个IEnumerable
,而不是一个值,因此您缺少对SingleOrDefault()
的调用,谢谢您的评论。看来我缺乏一些基础知识。我正在使用SQL Server。我不知道OUTPUT子句。那么,我们是否需要将其与查询方法一起使用呢?例如,我们可以对Execute方法执行相同的操作吗?我仍然在尝试理解OUTPUT子句,顺便说一句。我认为文档有点复杂。这就是为什么我想问它,而不是自己做。Execute不返回数据集,只返回被返回的行数。您可以将输出与它一起使用,但它将毫无意义,因为结果将被丢弃。