Ядро Entity Framework Выходной параметр не работает в процедуре хранения с использованием метода FromSql (Linq)

Я пытаюсь получить выходное значение из dbcontext, используя метод FromSql(...).

Если я выполняю его в SSMS, он работает, но не работает в ядре EF.

Мой параметр SP:

  @totalItems VARCHAR(MAX) OUTPUT 

Я удалил другие параметры для чтения и указал на проблему. Записи идут, но параметр OUTPUT всегда null.

Линк

IQeryable<T> = _context.Set<T>().FromSql("Sp_Todo @totalItems OUTPUT", // i also tried with OUT or without both Out/Output but no luck
 new SqlParameter("@totalItems", SqlDbType.Varchar)
 { Direction = ParameterDirection.Output});

person Robin    schedule 27.07.2017    source источник
comment
Ваша база данных использует VARCHAR, а запрос С# имеет BigInt.   -  person jdweng    schedule 27.07.2017
comment
Даже если я поставлю SqlDbType.VarChar, вернет ноль.   -  person Robin    schedule 27.07.2017
comment
попробуйте строку query= вместо var query=   -  person Ashu    schedule 27.07.2017
comment
Ашу Запрос не является строкой. Это IQeryable<T> Вы можете посмотреть на _context.Set<T>()   -  person Robin    schedule 27.07.2017
comment
Не ответ, но это должно быть IQueryable, а не IQeryable. Кроме того, вы можете использовать @, чтобы упоминать людей в комментариях. Например, @Робин.   -  person stybl    schedule 27.07.2017
comment
@Stybl Указание на правильное решение полезно вместо ошибки опечатки.   -  person Robin    schedule 27.07.2017
comment
Привет, @Alex Спасибо, но нет решения для этого метода, который я использую.   -  person Robin    schedule 27.07.2017


Ответы (1)


У меня нет доступа ко всему вашему коду, но ничего не будет выполнено против вашего запрашиваемого источника, пока вы не попытаетесь его перечислить. Так что, вероятно, он не запускал хранимую процедуру, когда вы пытались получить ВЫВОД.

Чтобы принудительно выполнить немедленную оценку запроса, вы можете сделать это:

 IQueryable<T> foo = _context.Set<T>().FromSql("Sp_Todo @totalItems OUTPUT", new SqlParameter("@totalItems", SqlDbType.Varchar) { Direction = ParameterDirection.Output });
 //totalItems output still null
 var bar = foo.ToList()
 //totalItems output not null anymore

Вот как я это делаю:

var _companyCode = new SqlParameter("CompanyCode", "HST");
var _sMsg = new SqlParameter("sMsg", "")
{
    Direction = ParameterDirection.Output,
    SqlDbType = SqlDbType.VarChar
};

var sql = "exec temp_get_company @CompanyCode, @sMsg OUTPUT";

var result = context.Set<Company>().FromSql(sql, _companyCode, _sMsg).ToList();

var yourOutput = _sMsg.Value.ToString();
person Rohirrim    schedule 21.08.2017