Dapper для NET Core: вставить в таблицу и вернуть идентификатор вставленной строки - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующий метод в моем хранилище.На данный момент я верю, что возвращаемое значение int просто указывает на то, была ли операция успешной.Я хочу, чтобы int был идентификатором (который является единственным столбцом таблицы), который будет возвращен после успешного выполнения.Как мне это сделать?

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

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Вы можете выполнить запрос, который состоит из 2 частей, первая - это ваша 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();
   }
}
0 голосов
/ 17 июня 2018

Вам не нужно вручную создавать запрос на вставку, вы можете использовать Dapper.Contrib github , который помогает вам управлять операциями CRUD.

С помощью Dapper.Contrib вы можете сделатьчто-то вроде:

 public async Task<int> AddNewGroup(Group entity)
 {
        using (_connection)
        {
             _connection.Open();
             var id = await _connection.InsertAsync(entity);
         }
 }
0 голосов
/ 02 июня 2018

Если вы используете SQL Azure / SQL Server, вам нужно вернуть вставленное значение из запроса, используя что-то вроде

INSERT INTO groups OUTPUT inserted.id VALUES (...)

, а затем вместо ExecuteAsync использовать ExecuteScalarAsync

Ссылка на предложение OUTPUT здесь: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

...