【问题标题】: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...");

使用...

(警告:未经测试,已经在家里躲了一段时间,所以也有点生疏)

【讨论】:

    最近更新 更多