NET Core的Dapper:插入表格并返回插入行的ID

Mik*_*ins 1 dapper asp.net-core

我的存储库中有以下方法。到目前为止,我相信返回的int只是一个指示操作是否成功的int。我希望int是成功执行后返回的id(即表的单列)。我该如何完成?

    public async Task<int> AddNewGroup()
    {
        using(_connection)
        {
            _connection.Open();
            var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Pop*_*rei 7

您不必手动创建插入查询,您可以使用Dapper.Contrib github来帮助您管理 CRUD 操作。

使用 Dapper.Contrib 您可以执行以下操作:

 public async Task<int> AddNewGroup(Group entity)
 {
        using (_connection)
        {
             _connection.Open();
             var id = await _connection.InsertAsync(entity);
         }
 }
Run Code Online (Sandbox Code Playgroud)

  • Dapper.Contrib 似乎只有返回 int 或 long 的 Insert 方法,但如果您想获取 Guid 作为插入结果,您可以使用 _connection.QueryFirstAsync&lt;T&gt;(rawSql) 创建自己的 Insert 方法,其中 rawSql 是您的插入带有输出的语句。例如。rawSql =“插入用户(id,用户名,名字,姓氏)输出插入。Id值(newid(),'rajiv','raj','iv');” 。您还可以使用 OUTPUT 来获取整个插入的行。 (2认同)

Shy*_*yju 5

您可以运行一个包含两部分的查询,第一部分是INSERT部分,第二部分是SELECT部分。在SELECT部分​​中,您可以返回(选择)所需的任何列值。

例如,如果您的组表中有一个名为的主键列,GroupId并且已将该列设置为标识值生成(自动值生成),则可以调用SCOPE_IDENTITY()来获取生成的值。

我们将使用该QueryAsync方法。

public async Task<int> AddNewGroup()
{
   using(_connection)
   {
      _connection.Open();
      var q = @"INSERT INTO Groups(Name,Description) VALUES
                 (@name, @desc); SELECT CAST(SCOPE_IDENTITY() as int)"
      var result = await _connection.QueryAsync<int>(q, 
                                          new { @name="some name", @desc="some desc"});
      return result.Single();
   }
}
Run Code Online (Sandbox Code Playgroud)