首页 > 解决方案 > Entity Framework Core - ExecuteSqlCommand:MAX 函数返回错误值

问题描述

我正在尝试做一件简单的事情:获取一列的 MAX。很简单,你知道,只要运行 SELECT MAX(column) 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);
}

正在正确生成查询:

在此处输入图像描述

但是,它返回 -1 而不是实际值。

在此处输入图像描述

但是当我在 Sql Server Management Studio 中运行完全相同的查询时,结果是正确的:

在此处输入图像描述

这是怎么回事?

标签: sql-server.net-coreentity-framework-coreasp.net-core-2.0

解决方案


对于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();
}

推荐阅读