该方法为查询提供了一个字符串,并为参数提供了一个Object []
数组,可能是为了避免SQL注入。
然而,地球上没有任何地方记录了你应该放入对象数组的内容。
关于SO的另一个问题是,这个问题完全相同,但接受的答案不起作用:When using DbSet<T>.SqlQuery(), how to use named parameters?
我已经尝试过所有形式的参数替换,我能想到并且所有参数都会抛出异常。有什么想法吗?
它会如此简单:
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".
答案 0 :(得分:18)
您的查询语法没有任何问题,或者您如何创建和传递SqlParameter
个对象。
您的问题是您尝试使用变量作为表名,这是您无法做到的(请参阅:Must declare the table variable @table),因此您需要手动“模板化”表名称在您的查询中:
类似的东西。
var result = context.Users.SqlQuery<T>(
"SELECT * FROM " + tableName + " WHERE @p0 = '@p1'",
new SqlParameter("p0", propertyName),
new SqlParameter("p1", searchQuery));