c# - 如何使用 Pomelo/Entity 从存储过程中获取 SELECT COUNT(*) 的结果
问题描述
我正在使用 ASP NET core 5.0 并使用 Pomelo 来处理 MariaDB 数据库
我有一个存储过程,它接受一堆参数并返回一个 SELECT COUNT(*),所以是一个很好的简单整数。我认为这将是相当微不足道的,但事实证明这实际上非常困难
我可以通过执行以下操作来做一个非常丑陋的解决方法:
Database.GetDbConnection().Open();
using (var x = Database.GetDbConnection().CreateCommand())
{
x.CommandText = "test";
x.CommandType = System.Data.CommandType.StoredProcedure;
var q = await x.ExecuteScalarAsync();
Console.WriteLine(q);
}
但我真的不想打开和关闭连接,因为这只是 janky
我以为我可以使用 Database.ExecuteSqlRaw[async],但它的返回值是受影响的行,而不是查询的实际输出。我尝试了各种获取返回值的尝试,其中大多数都抛出异常,而其他的则什么都不做。
那么,有没有一种整洁的方法可以做到这一点,还是我有一个笨拙的解决方法?
解决方案
这几乎是推荐的方法,只需替换Database.GetDbConnection().Open()
为Database.OpenConnectionAsync()
,以便 EF Core 为您管理连接并在不再需要时关闭它(否则,如果 EF Core 尚未打开连接,您会突然负责稍后关闭它)。
将所有内容放在扩展方法中以便于重用并继续:
public static async Task<T> GetScalarStoredProcedureResultAsync<T>(
this DbContext context,
string name)
{
await context.Database.OpenConnectionAsync();
var connection = context.Database.GetDbConnection();
using var command = connection.CreateCommand();
command.CommandText = name;
command.CommandType = System.Data.CommandType.StoredProcedure;
return (T) await command.ExecuteScalarAsync();
}
电话是:
var count = yourContext.GetScalarStoredProcedureResultAsync<long>("test");
Console.WriteLine(count);
推荐阅读
- pycharm - PyCharm PyTest:未找到测试对象
- javascript - 如何在不下载 javascript 的情况下访问 csv
- python - 一个接一个地运行python脚本,没有任何中断
- python - 如何向 Django 类添加方法以转换为字典
- maven - 如何配置 maven post-man 插件以包含具有动态名称的附件目录?
- python - 如何检查数字是否在多个范围内?
- regex - PowerShell:使用通配符从变量中删除文本
- laravel - 错误 composer install 在 laravel 脚本之后,在迁移到 php 8 和 laravel 8.4 之后 - 该进程已用信号“11”发出信号
- wordpress - 将自定义样式添加到没有子主题的古腾堡编辑器
- java - Java method to add variables for each element in an array