繁体   English   中英

运行实体框架核心原始 SQL 没有实体

[英]Run entity framework core raw SQL without entity

我有这个 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>方法。

怎么做才对?

我认为这基本上是对这里回答的问题的重复:

使用EF Core获取存储过程的output参数值?

尽管我承认那是 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...");

要使用...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM