Вызов хранимой процедуры в Entity Framework - PullRequest
0 голосов
/ 24 мая 2019

Я использую Entity Framework для вызова хранимой процедуры. Хранимая процедура выглядит так:

ALTER PROCEDURE [dbo].[AdminContracts] 
    @StatusId INT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT .. 

и мой код выглядит так:

public virtual ObjectResult<AdminOrder> GetAdminOrders(int orderStatus)
{
    return ((IObjectContextAdapter) this).ObjectContext.ExecuteStoreQuery<AdminOrder>("AdminContracts", new SqlParameter("@StatusId", orderStatus));
}

, что кажется правильным из других вопросов по SO

Однако, это вызывает исключение:

Процедура или функция AdminContracts ожидает параметр @StatusId, который не был предоставлен

Выглядит нормально для меня, но, очевидно, я что-то упускаю

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Попробуйте этот код:

public virtual ObjectResult<AdminOrder> GetAdminOrders(int orderStatus)
    {
        return ((IObjectContextAdapter) this).ObjectContext.ExecuteStoreQuery<AdminOrder>("EXEC AdminContracts @StatusId", new SqlParameter("StatusId", orderStatus));
    }
0 голосов
/ 24 мая 2019

ExecuteStoreQuery<T> Метод Выполняет запрос непосредственно к источнику данных, который возвращает последовательность типизированных результатов. так что пользователь может запустить оператор T-SQL, вы можете проверить его документацию поэтому ваш код будет выглядеть следующим образом:

public virtual ObjectResult<AdminOrder> GetAdminOrders(int orderStatus)
{
        return ((IObjectContextAdapter) this).ObjectContext.ExecuteStoreQuery<AdminOrder>("EXEC AdminContracts @StatusId", new SqlParameter("StatusId", orderStatus));
}

но если вы хотите вызвать сохраненного производителя или функцию, вы можете использовать ExecuteFunction<TElement> метод Выполняет хранимую процедуру или функцию, которая определена в источнике данных и сопоставлена ​​в концептуальной модели с указанными параметрами. Возвращает типизированный ObjectResult. вы можете проверить документацию

поэтому ваш код будет следующим:

public virtual ObjectResult<AdminOrder> GetAdminOrders(int orderStatus)
{
  return ((IObjectContextAdapter) this).ObjectContext.ExecuteStoreQuery<AdminOrder>("AdminContracts", new ObjectParameter("@StatusId", orderStatus));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...