sql-server - 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 中运行完全相同的查询时,结果是正确的:
这是怎么回事?
解决方案
对于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();
}
推荐阅读
- javascript - 谷歌浏览器在警报被解除之前执行 HTMLElement.focus
- amazon-web-services - 可以向 aws s3 presign url 发送 PUT 请求吗?
- c# - 带有表达式的属性中使用的 Nullable DateTime 返回意外的默认值
- c# - 如何构建我的游戏并显示错误消息“编辑器正在导入资产或编译脚本时无法构建播放器”
- android - Android-CameraX:在多个前置摄像头之间切换
- android - 如何通知适配器特定视图更改而不是整个 ViewHolder 更改?
- r - 查找字符串序列在其他向量中的位置
- perl - 打印输出的智能格式化
- java - 我必须同时放置 persistence.xml 和 hibernate.cfg.xml 吗?我部署时似乎有冲突
- javascript - 如何在 React 中通过单击动态添加的按钮触发功能?