Что входит в параметр 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));