11

该方法采用一个字符串作为查询,一个数组Object []作为参数,大概是为了避免 SQL 注入。

然而,地球上没有任何地方记录了您应该放入对象数组的内容。

关于 SO 的另一个问题提出了完全相同的问题,但接受的答案不起作用:使用 DbSet<T>.SqlQuery() 时,如何使用命名参数?

我已经尝试了我能想到的所有形式的参数替换,它们都抛出异常。有任何想法吗?

会不会像这样简单:

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".

4

1 回答 1

19

您的查询语法或您如何创建和传递SqlParameter对象没有任何问题。

您的问题是您尝试使用变量作为表名,这是您不能做的(请参阅:必须声明表变量 @table),因此您需要在查询中手动“模板化”表名:

就像是。

var result = context.Users.SqlQuery<T>(
"SELECT * FROM " + tableName + " WHERE @p0 = '@p1'", 
   new SqlParameter("p0", propertyName), 
   new SqlParameter("p1", searchQuery));
于 2013-07-25T15:52:40.237 回答