Мне нужно прочитать результат хранимой процедуры, вызванной из EF Core, которая включает элементы, предназначенные для целей форматирования электронных таблиц, например строки только с нулевыми значениями. Мой код в основном работает, но есть два столбца, которые приводят к сбою запроса, когда я их включаю.
Вот мой класс модели (для краткости включены только несколько реквизитов):
public class StoredProcRecord
{
[Column("Prod Line")]
public string ProductLine { get; set; }
[Column("Current Sales")]
public decimal? CurrentSales { get; set; }
[Column("Current Margin $")]
public decimal? CurrentMargin { get; set; }
}
Вот фрагмент части вывода, если я запускаю хранимую процедуру из SQL Server Management Studio:
Вот как я зарегистрировал тип как модель объекта с помощью EF Core в контексте БД:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<StoredProcRecord>();
}
Вот как я вызываю хранимую процедуру:
return _context.Query<StoredProcRecord>().FromSql("EXECUTE my_stored_proc").ToList();
В этом примере EF Core всегда выдает исключение при попытке вызвать FromSql()
с сообщением:
Требуемый столбец «Текущая маржа $» отсутствовал в результатах операции «FromSql».
Согласно документам EF Core, если столбец может принимать значения NULL, тогда он не требуется. Тем не менее, я получаю это исключение, в котором утверждается, что требуется «Текущая маржа $». Это также происходит только со свойством CurrentMargin
, а не со свойством CurrentSales
, которое использует тот же тип. Если я удалю CurrentMargin
, все будет работать нормально, и я просто упущу это свойство.
Я попытался использовать [Column(Order = 2)]
вместо именованного столбца, думая, что, возможно, знак доллара в имени столбца как-то связан с этим, но это приводит к:
Требуемый столбец «CurrentMargin» отсутствовал в результатах операции «FromSql».
Включение как порядка, так и имени приводит к ошибке того же типа.
Стоит отметить, что это не хранимая процедура, которую я могу обновлять.
Чем свойство CurrentMargin
отличается от свойства CurrentSales
, что приводит к такому сбою? Есть ли какой-то особый способ обработки знака доллара в имени столбца? Я что-то совсем другое упускаю?
Изменить:
Вот фрагмент из самого конца хранимой процедуры, где выводится результирующая таблица. Я включаю это, чтобы показать, что «Current Margin $» действительно является одним из имен столбцов. На самом деле я скопировал/вставил прямо из хранимой процедуры, чтобы убедиться, что я не ошибся при вводе имени столбца.
BEGIN
-- bulk of stored procedure that builds #tmp_tbl omitted for length
SELECT
'Prod Line' = pl_key,
'Current Sales' = curr_sales,
'Current Margin $' = curr_margin
FROM #tmp_tbl
END
Yet, I receive that exception that claims "Current Margin $" is required.
-Нет, это не так! На самом деле это говорит о том, что в выводе, возвращаемом запросом, нет такого столбца с именемCurrent Margin $
. - person TanvirArjel   schedule 16.03.2019CREATE PROCEDURE [dbo].[my_stored_proc] AS DECLARE @DATA TABLE(ProductLine VARCHAR(20), CurrentSales decimal, CurrentMargin decimal); insert into @DATA values('1', 1, 1); insert into @DATA values('2', 2, 2); insert into @DATA values('3', 3, 3); insert into @DATA values('4', 4, 4); insert into @DATA values(null, null, null); select T.ProductLine [Prod Line], T.CurrentSales [Current Sales], T.CurrentMargin [Current Margin $] from @DATA T; RETURN 0
Другими словами, он не воспроизводит - person Ivan Stoev   schedule 17.03.2019SELECT
вашего SP выглядит странно, возможно, все возвращаемые имена столбцов не соответствуют вашим ожиданиям — EF Core просто сообщает имя первого отсутствующего столбца в алфавитном порядке. Чтобы увидеть, что вы получите, выполните следующий фрагментvar cn = _context.Database.GetDbConnection(); var cmd = cn.CreateCommand(); cmd.CommandText = "my_stored_proc"; cn.Open(); var dr = cmd.ExecuteReader(); var cols = Enumerable.Range(0, dr.FieldCount).Select(i => dr.GetName(i)).ToList();
и проверьте переменнуюcols
в отладчике. - person Ivan Stoev   schedule 17.03.2019