Mam następującą metodę w moim repozytorium. Na razie wierzę, że zwrócony jest po prostu wskazujący, czy operacja zakończyła się sukcesem. Chcę, aby Id był identyfikatorem (który jest pojedynczą kolumną tabeli), który ma zostać zwrócony po pomyślnym wykonaniu. Jak to osiągnąć?

    public async Task<int> AddNewGroup()
    {
        using(_connection)
        {
            _connection.Open();
            var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
        }
    }
1
Mike Hawkins 2 czerwiec 2018, 00:05

3 odpowiedzi

Najlepsza odpowiedź

Możesz uruchomić zapytanie, które ma 2 części, najpierw jest wstaw część, a sekundę jest Wybierz część. W wybranej części możesz wrócić (wybierz) dowolna wartość kolumny, którą chcesz.

Na przykład, jeśli tabela grupa ma podstawową kolumnę Kluczową o nazwie GroupId i ustawiłeś tę kolumnę do wytwarzania wartości tożsamości (automatyczna generacja wartości), możesz zadzwonić do SCOPE_IDENTITY(), aby uzyskać wygenerowaną wartość.

Użyjemy metody 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();
   }
}
6
Shyju 2 czerwiec 2018, 00:14

Nie musisz tworzyć ręcznie Query, możesz użyć Dapper.Contrib GitHub który pomaga zarządzać operacjach CRUD.

Korzystanie z Dapper.Contrib możesz zrobić coś w rodzaju:

 public async Task<int> AddNewGroup(Group entity)
 {
        using (_connection)
        {
             _connection.Open();
             var id = await _connection.InsertAsync(entity);
         }
 }
2
Popa Andrei 17 czerwiec 2018, 16:47

Jeśli używasz SQL Azure / SQL Server, musisz zwrócić wstawioną wartość z zapytania za pomocą czegoś podobnego

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

A następnie zamiast tego używać ExecuteAsync użyj ExecuteScalarAsync

Odniesienie do klauzuli wyjściowej tutaj: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017.

0
mauridb 1 czerwiec 2018, 22:18