Я пытаюсь создать динамическое предложение WHERE с LINQ. У меня есть рабочий пример, но я беспокоюсь, что это не безопасно от SQL-инъекции.Безопасное имя динамического столбца в динамическом LINQ
Следующий код LINQ:
var oQuery = _db.People.Where("FirstName.Contains(@0)", "kev");
производит следующий SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE [Extent1].[[FirstName] LIKE '%kev%'
Это прекрасно работает, но теперь я хочу, чтобы использовать динамическое имя столбца, а также. Так я думал, я хотел бы сделать следующее:
var oQuery = _db.People.Where("@0.Contains(@1)", strSelectedColumn,"kev");
Но это производит следующий SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE N'FirstName' LIKE N'%kev%'}
, который, очевидно, является неправильным и дает 0 строк, как результат, потому что он сравнивает 2 строки. Используя параметры, LINQ, вероятно, просто будет вводить параметры как строку при построении запроса, а не использовать эффективное имя столбца во время сборки.
Решение просто использовать следующий запрос LINQ:
var oQuery = _db.People.Where(strSelectedColumn + ".Contains(@0)", "kev");
Но этот результат в возможной небезопасной SQL, который может быть использован для введения SQL.
Как я могу использовать свои динамические столбцы LINQ и по-прежнему получать безопасный код?
Как вы предлагаете имена полей, из которых пользователь может выбрать? –
Они не могут выбрать динамически, я использую его для фильтрации столбцов в сетке, и я хотел бы повторно использовать сетку на разных страницах. –