Entity Framework Core - ExecuteSqlCommand: функция MAX, возвращающая неправильное значение - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь сделать простую вещь: получить МАКС из столбца. Это довольно просто, вы знаете, просто запустите SELECT MAX (столбец) FROM table;

Проблема заключается в том, что я пытаюсь сделать это в своем проекте .NET Core 2.1, используя Entity Framework.

У меня есть функция, которая должна возвращать следующее значение столбца.

private int getColumNextValue(string table, string column)
{
  string query = $"SELECT MAX({column}) + 1 FROM {table};";    
  return base.context.Database.ExecuteSqlCommand(query);
}

Запрос генерируется корректно:

enter image description here

Однако он возвращает -1 вместо реального значения.

enter image description here

Но когда я запускаю точно такой же запрос в Sql Server Management Studio, результат будет правильным:

enter image description here

Что происходит?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я использовал QueryFirstOrDefault<int>, чтобы решить мою проблему.Я написал этот вспомогательный метод для многократного использования:

private int GetColumNextValue(string table, string column)
{
  using (SqlConnection conn = new SqlConnection(this.configuration.GetConnectionString("MyConnection")))
  {
    string query = $"SELECT MAX({column}) + 1 FROM {table};";
    return conn.QueryFirstOrDefault<int>(query);
  }
}

Я надеюсь, что он может помочь другим людям.

0 голосов
/ 27 марта 2019

Для ExecuteSqlCommand возвращает только количество затронутых строк. Он не запустит запрос и не вернет результат.

В качестве обходного пути вы можете попробовать:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    public DbSet<User> User { get; set; }


    public async Task<T> ExecuteScalarAsync<T>(string rawSql, params object[] parameters)
    {
        var conn = Database.GetDbConnection();
        using (var command = conn.CreateCommand())
        {
            command.CommandText = rawSql;
            if (parameters != null)
                foreach (var p in parameters)
                    command.Parameters.Add(p);
            await conn.OpenAsync();
            return (T)await command.ExecuteScalarAsync();
        }
    }
}

И использовать ExecuteScalarAsync как

public async Task<IActionResult> Index()
{
    string query = $"SELECT MAX(SEQ) + 1 FROM [User];";
    var result = await _context.ExecuteScalarAsync<int>(query);
    return View();
}
...