实体框架中.SqlQuery()方法的params参数是什么?

Nib*_*Pig 10 c# sql entity-framework

该方法为查询提供了一个字符串,并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));
Run Code Online (Sandbox Code Playgroud)

这给了 Must declare the table variable "@p0".

var result = context.Users.SqlQuery<T>("SELECT * FROM {0} WHERE {1} = '{2}'", tableName, propertyName, searchQuery);
Run Code Online (Sandbox Code Playgroud)

这给了 Must declare the table variable "@p0".

nem*_*esv 18

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

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

就像是.

var result = context.Users.SqlQuery<T>(
"SELECT * FROM " + tableName + " WHERE @p0 = '@p1'", 
   new SqlParameter("p0", propertyName), 
   new SqlParameter("p1", searchQuery));
Run Code Online (Sandbox Code Playgroud)

  • @SLC 如果表名来自用户输入,请确保对其进行清理以避免 sql 注入。例如,请参见此处:http://stackoverflow.com/q/13887202/284111 (2认同)