Я пытаюсь создать динамическое предложение WHERE с помощью LINQ. У меня есть рабочий пример, но я беспокоюсь, что он не защищен от SQL-инъекций.
Следующий код 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 и при этом получать безопасный код?