EF Core FromSqlRaw с переменной столбца

#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 что может быть лучше, поскольку мои параметры могут быть установлены клиентом.