【问题标题】:Run entity framework core raw SQL without entity在没有实体的情况下运行实体框架核心原始 SQL
【发布时间】:2020-04-22 13:49:14
【问题描述】:
我有这个mysql存储过程:
CREATE DEFINER=`admin`@`%` PROCEDURE `Counter_increment2`(IN _Id VARCHAR(80), IN _CounterType VARCHAR(10), IN IncrBy INT)
BEGIN
UPDATE Counter SET Value = @counter := Value + IncrBy WHERE Id=_Id AND CounterType=_CounterType;
SELECT @counter as Value;
END
结果是:
我想通过 EF 将第一行中的第一个单元格读入 C# 变量。
我知道过去 EF 为这种使用提供了SqlQuery<type> 方法。
怎么做才对?
【问题讨论】:
标签:
c#
entity-framework
entity-framework-core
【解决方案1】:
我认为这基本上是对这里回答的问题的重复:
Get output parameter value of a stored procedure using EF Core?
虽然我承认那是 EF Core 2.something,但使用其中的最佳答案对我有帮助。假设您使用的是 3.x,可能需要进行调整。
注意:对于您在此处列出的特定情况(在单行上返回单个 int 列),我创建了自己的扩展方法,如下所示:
public static class RDFacadeExtensions
{
public static async Task<int> ExecuteScalarQueryAsync(this DatabaseFacade databaseFacade, string sql, params object[] parameters)
{
var concurrencyDetector = databaseFacade
.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
var result = await rawSqlCommand
.RelationalCommand
.ExecuteScalarAsync(
databaseFacade.GetService<IRelationalConnection>(),
parameterValues: rawSqlCommand.ParameterValues);
return (int)result;
}
}
}
然后您应该可以简单地调用:
int result = Context.Database.ExecuteScalarQueryAsync("exec procedure...");
使用...
(警告:未经测试,已经在家里躲了一段时间,所以也有点生疏)