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

时间:2013-07-25 15:28:34

标签: c# sql entity-framework

该方法为查询提供了一个字符串,并为参数提供了一个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".

1 个答案:

答案 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));