Entity Framework 核心 - ExecuteSqlCommand:MAX 函数返回错误值
Entity Framework Core - ExecuteSqlCommand: MAX function returning wrong value
我正在尝试做一件简单的事情:获取列的最大值。很简单,你知道的,只是 运行 SELECT MAX(column) FROM table;
问题是当我尝试在我的 .NET Core 2.1 项目中使用 Entity Framework.
执行此操作时
我有一个函数应该 return 列的下一个值。
private int getColumNextValue(string table, string column)
{
string query = $"SELECT MAX({column}) + 1 FROM {table};";
return base.context.Database.ExecuteSqlCommand(query);
}
正在正确生成查询:
但是,它是 returning -1 而不是实际值。
但是当我 运行 在 Sql Server Management Studio 中进行完全相同的查询时,结果是正确的:
怎么回事?
对于ExecuteSqlCommand
,它只影响return行数。它不会 运行 查询和 return 结果。
对于解决方法,您可以尝试:
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();
}
我用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);
}
}
希望对其他人有所帮助。
我正在尝试做一件简单的事情:获取列的最大值。很简单,你知道的,只是 运行 SELECT MAX(column) FROM table;
问题是当我尝试在我的 .NET Core 2.1 项目中使用 Entity Framework.
执行此操作时我有一个函数应该 return 列的下一个值。
private int getColumNextValue(string table, string column)
{
string query = $"SELECT MAX({column}) + 1 FROM {table};";
return base.context.Database.ExecuteSqlCommand(query);
}
正在正确生成查询:
但是,它是 returning -1 而不是实际值。
但是当我 运行 在 Sql Server Management Studio 中进行完全相同的查询时,结果是正确的:
怎么回事?
对于ExecuteSqlCommand
,它只影响return行数。它不会 运行 查询和 return 结果。
对于解决方法,您可以尝试:
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();
}
我用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);
}
}
希望对其他人有所帮助。