Запустите базовую платформу сущности raw SQL без сущности - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть 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

Результат: enter image description here

Я хочу прочитать первую ячейку в первая строка в переменную C# через EF.

Я знаю, что в прошлом EF предоставлял SqlQuery<type> метод для этого вида использования.

Как это сделать правильно?

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю, что это в основном повтор вопроса, на который здесь дан ответ:

Получить значение выходного параметра хранимой процедуры с использованием EF Core?

Использование верхнего ответа там мне помогли, хотя я признаю, что это был EF Core 2. что-то. Возможно, потребуется настроить для 3.x, предполагая, что это то, что вы используете.

Примечание: для указанного c случая, который вы перечислили здесь (возвращая один столбец 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...");

Для использования ...

(предостережение: не проверено в таком виде прятались дома какое-то время, поэтому тоже немного ржавые)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...