Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用Dapper中的查询方法插入和更新行吗?_C#_Asp.net Core_Asp.net Core Webapi_Dapper - Fatal编程技术网

C# 我可以使用Dapper中的查询方法插入和更新行吗?

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)" +

我试图找出是否可以在Dapper中使用Query方法来插入和更新行,因为我想在应用插入和更新操作后返回一个对象

我找不到任何值得注意的答案,所以我只是尝试:

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.EmptyPartition
1[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不返回数据集,只返回被返回的行数。您可以将输出与它一起使用,但它将毫无意义,因为结果将被丢弃。