我可以在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.List1[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();
    }
}