Что входит в параметр params метода .SqlQuery() в Entity Framework?
Метод берет строку для запроса и массив Object []
для параметров, по-видимому, чтобы избежать внедрения SQL.
Однако нигде на самом деле он не задокументировал, что вы должны поместить в массив объектов.
Есть еще один вопрос о SO, который запрашивает это одно и то же, но принятый ответ не работает: При использовании DbSet <T> .SqlQuery(), как использовать named параметры?
Я пробовал все формы замены параметров, о которых я могу думать, и все они бросают исключение. Любые идеи?
Было бы так просто:
SqlQuery("SELECT * FROM @table", "Users")
Изменить: Вот некоторые вещи, которые я пробовал (исключение - SqlException
):
var result = context.Users.SqlQuery<T>("SELECT * FROM @p0 WHERE @p1 = '@p2'",
new SqlParameter("p0", tableName),
new SqlParameter("p1", propertyName),
new SqlParameter("p2", searchQuery));
Это дает Must declare the table variable "@p0".
var result = context.Users.SqlQuery<T>("SELECT * FROM {0} WHERE {1} = '{2}'", tableName, propertyName, searchQuery);
Это дает Must declare the table variable "@p0".
Ответы
Ответ 1
Нет ничего плохого в синтаксисе запроса или как вы создали и передали объекты SqlParameter
.
Ваша проблема заключается в том, что вы пытаетесь использовать переменную в качестве имени таблицы, что вы не можете сделать (см. Должен объявить переменную таблицы @table), поэтому вам нужно вручную "шаблонировать" имя таблицы в вашем запросе:
Что-то вроде.
var result = context.Users.SqlQuery<T>(
"SELECT * FROM " + tableName + " WHERE @p0 = '@p1'",
new SqlParameter("p0", propertyName),
new SqlParameter("p1", searchQuery));