#c# #entity-framework-core
#c# #сущность-фреймворк-ядро
Вопрос:
Попытка установить столбец в качестве параметра FromRawSql
. Запрос всегда возвращает null, я понимаю, это потому, что SQL компилируется до установки значений параметров. Как я могу передать имя столбца в запрос в качестве параметра?
Что я пытаюсь:
var param = new SqlParameter[] {
new SqlParameter("@col", dataDiscriminator),
new SqlParameter("@value", itemDiscValue)
};
var thisq = context.Devices.FromSqlRaw("SELECT * FROM Devices WHERE @col = @value", param);
var thisDevice = thisq.SingleOrDefault();
Создаст SQL:
DECLARE @col nvarchar(4) = N'Name';
DECLARE @value nvarchar(26) = N'Registration Template';
SELECT * FROM Devices WHERE @prop = @value
Ответ №1:
вы не можете использовать параметр для имени таблицы или столбца. Попробуйте это
var param = new SqlParameter[] {
new SqlParameter("@value", itemDiscValue)
};
var thisq = context.Devices.FromSqlRaw($"SELECT * from Devices
WHERE [{dataDiscriminator}] = @value", param).ToList();
var thisDevice = thisq.SingleOrDefault();
Я не знаю, откуда берутся данные dataDiscriminator, но всегда помните об инъекциях sql-скрипта.
Комментарии:
1. Я узнал, что FromSqlInterpolated является предпочтительным методом для передачи параметров таким образом. «Методы FromSqlInterpolated и ExecuteSqlInterpolated позволяют использовать синтаксис интерполяции строк таким образом, чтобы защитить от атак SQL-инъекций» — docs.microsoft.com/en-us/ef/core/querying/raw-sql что может быть лучше, поскольку мои параметры могут быть установлены клиентом.