Ядрото на рамката на обекта Изходният параметър не работи в процедурата за съхранение, използвайки метода FromSql (Linq)

Опитвам се да получа изходна стойност от dbcontext, използвайки метода FromSql(...).

Ако го изпълня на SSMS, той работи, но не работи в ядрото на EF.

Моят SP параметър:

  @totalItems VARCHAR(MAX) OUTPUT 

Премахнах други параметри за четене и посочих проблема. Записите идват, но параметърът OUTPUT винаги е null.

Linq

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, докато c# заявката има BigInt.   -  person jdweng    schedule 27.07.2017
comment
Дори и да поставя SqlDbType.VarChar връща нула.   -  person Robin    schedule 27.07.2017
comment
опитайте string query= на мястото на var query=   -  person Ashu    schedule 27.07.2017
comment
Ашу Заявката не е низът. Това е IQeryable<T> Можете да видите на _context.Set<T>()   -  person Robin    schedule 27.07.2017
comment
Не е отговор, но трябва да е IQueryable, а не IQeryable. Освен това можете да използвате @, за да споменавате хора в коментари. Например @Robin.   -  person stybl    schedule 27.07.2017
comment
@Stybl Посочването на правилното решение е полезно вместо печатна грешка.   -  person Robin    schedule 27.07.2017
comment
Здравей, @Alex Благодаря, но няма решение за този метод, който използвам.   -  person Robin    schedule 27.07.2017


Отговори (1)


Нямам достъп до целия ви код, но нищо никога не се изпълнява срещу вашия източник, който може да бъде заявен, докато не се опитате да го изброите. Така че вероятно не е изпълнила съхранената процедура, когато сте се опитали да получите OUTPUT.

За да принудите незабавна оценка на заявката, можете да го направите:

 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