Используйте EntityFramework Core для вызова MSSQL StoredProcedure и отображения возвращаемых данных - - PullRequest
0 голосов
/ 30 августа 2018

Ну, вопрос не требует пояснений. Так что я не буду излишне расширять его. Вот мой ИП -

    CREATE procedure [dbo].[sp_TotalSalesByCustomerID]
    @customer_id nvarchar(50),
    @varSale decimal OUTPUT  
    as

    begin

    begin try

    if exists (
            Select * from tempdb..sysobjects Where id = 
       object_id('tempdb.dbo.#temp')
          )
        DROP TABLE #temp

    else

        select * into #temp from Orders where customer_id=@customer_id

        select @varSale=SUM(total_price) from #temp

    end try

    begin catch
           select error_message(),
           error_severity(),
           error_number(),
           error_state()    
    end catch

    end

Как видите, SP в основном возвращает только вычисленное значение. Он не сопоставлен ни с каким объектом / классом сущности в моем приложении. Код C # на моей стороне web-интерфейса бэкэнда, который я написал -

[Route("TotalSalesByCustomerID")]
    [HttpPost]
    public JsonResult TotalSalesByCustomerID([FromBody]string customer_id)
    {
        try
        {
            //var salesT = (_appDbContext.Totals.FromSql("call sp_TotalSalesByCustomerID(@customer_id)", customer_id));
            var salesT= _appDbContext.Database.ExecuteSqlCommand("sp_TotalSalesByCustomerID @p0", parameters: new[] { customer_id });
            return Json(salesT);
        }
        catch(Exception exp)
        {
            return Json(exp.GetBaseException());
        }
    }

Я не знаю, какой мусор из трески он возвращает. Возможно потому, что он не сопоставлен с объектом класса сущности. Я это понимаю. Вероятно, некоторые из кода C # тоже не так. Мне тоже не нужен отдельный класс. Это всего лишь одно значение! Если я добавлю класс, мне, вероятно, потребуется также выполнить миграцию, а в моем сценарии это не нужно. Просто для справки, это тоже мой класс построителя миграции, где я добавил свой sql-код в 'Up and' Down '-

protected override void Up(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE procedure [dbo].[sp_TotalSalesByCustomerID]
                    @customer_id nvarchar(50),
                    @varSale decimal OUTPUT  
                    as

                    begin

                    begin try

                    if exists (
                                Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#temp')
                              )
                            DROP TABLE #temp

                    else

                            select * into #temp from Orders where customer_id=@customer_id

                            select @varSale=SUM(total_price) from #temp

                    end try

                    begin catch
                        select error_message(),
                               error_severity(),
                               error_number(),
                               error_state()    
                    end catch

                    end";

        migrationBuilder.Sql(sp);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE procedure [dbo].[sp_TotalSalesByCustomerID]
                    @customer_id nvarchar(50),
                    @varSale decimal OUTPUT  
                    as

                    begin

                    begin try

                    if exists (
                                Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#temp')
                              )
                            DROP TABLE #temp

                    else

                            select * into #temp from Orders where customer_id=@customer_id

                            select @varSale=SUM(total_price) from #temp

                    end try

                    begin catch
                        select error_message(),
                               error_severity(),
                               error_number(),
                               error_state()    
                    end catch

                    end";

        migrationBuilder.Sql(sp);
    }

Я не знаю, что делать. Конечно, я упускаю какой-то хороший трюк или хак, который сделает это. Что это? Могу ли я создать какую-то виртуальную / абстрактную сущность, которую я могу просто использовать в EF Core для получения своих данных вместо создания таблиц, добавления миграции и т. Д. В мою БД? Какие еще варианты? Я с нетерпением жду хорошей помощи в этом. Спасибо всем,

1 Ответ

0 голосов
/ 30 августа 2018

Вы должны использовать выходной параметр instdead возвращаемого значения, как показано ниже:

var outputParam = new SqlParameter("outputParam", SqlDbType.Int) { Direction = ParameterDirection.Output };
await _databaseContext.Database.ExecuteSqlCommand($"EXEC {storedProcedureName} @param1, @outputParam output", new SqlParameter("param1"), outputParam);

Чтобы получить значение, вам нужно позвонить outputParam.Value после двух строк выше.

Возвращаемое значение ExecuteSqlCommand() является целым числом, которое является числом записей, затронутых запросом.

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