我可以在Dapper中使用查询方法来插入和更新行吗?
Can I Use Query Method in Dapper To Insert And Update Rows?
我想知道是否可以在 Dapper 中使用 Query 方法来插入和更新行,因为我想在应用插入和更新操作后 return 一个对象。
我找不到任何出色的答案,所以我试了一下:
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);
}
}
但这给出了错误:System.InvalidCastException:无法转换类型为 'System.Linq.EmptyPartition1[HotelFinder.Entities.Hotel]' to type 'System.Collections.Generic.List
1[HotelFinder.Entities.Hotel]' 的对象。
你知道我该如何解决这个问题吗?还是完全错了?
首先,您需要使用 OUTPUT
子句才能从插入语句中获取 return 行。
其次,QueryAsync
会 return 一个 IEnumerable<Hotel>
而不是 Hotel
,所以你将无法施放它。
放在一起,看起来像这样
public async Task<Hotel> CreateHotel(Hotel hotel)
{
var sql = "INSERT INTO Hotels" +
" (name, city)" +
" OUTPUT inserted.name, inserted.city" +
" VALUES (@name, @city)";
var newHotel = new Hotel()
{
Name = hotel.Name,
City = hotel.City
};
using (var connection = new SqlConnection(CONNECTION_STRING))
{
return (await connection.QueryAsync<Hotel>(sql, newHotel)).SingleOrDefault();
}
}
我想知道是否可以在 Dapper 中使用 Query 方法来插入和更新行,因为我想在应用插入和更新操作后 return 一个对象。
我找不到任何出色的答案,所以我试了一下:
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);
}
}
但这给出了错误:System.InvalidCastException:无法转换类型为 'System.Linq.EmptyPartition1[HotelFinder.Entities.Hotel]' to type 'System.Collections.Generic.List
1[HotelFinder.Entities.Hotel]' 的对象。
你知道我该如何解决这个问题吗?还是完全错了?
首先,您需要使用 OUTPUT
子句才能从插入语句中获取 return 行。
其次,QueryAsync
会 return 一个 IEnumerable<Hotel>
而不是 Hotel
,所以你将无法施放它。
放在一起,看起来像这样
public async Task<Hotel> CreateHotel(Hotel hotel)
{
var sql = "INSERT INTO Hotels" +
" (name, city)" +
" OUTPUT inserted.name, inserted.city" +
" VALUES (@name, @city)";
var newHotel = new Hotel()
{
Name = hotel.Name,
City = hotel.City
};
using (var connection = new SqlConnection(CONNECTION_STRING))
{
return (await connection.QueryAsync<Hotel>(sql, newHotel)).SingleOrDefault();
}
}