所以我有这个问题:
var retval = db.v_AViewOfJoinedTables.SqlQuery("SELECT * FROM dbo.v_AViewOfJoinedTables WHERE @filter = '@value';",
new SqlParameter("@filter", columnname),
new SqlParameter("@value", value)).ToList();
但我没有得到任何结果。如果我通过SSMS运行此查询,它将返回数据。我知道如果我使用表而不是它有效。那么SqlQuery只能用于表格,或者我的查询或代码是错误的吗?
更新代码:
SqlCommandBuilder scb = new SqlCommandBuilder();
string columnname = userNameFilterType;
string escapedColumnName = scb.QuoteIdentifier(columnname);
string sqlQuery = String.Format("SELECT * FROM dbo.v_AViewOfJoinedTables WHERE {0} = '@username';", escapedColumnName);
var retval = db.v_AViewOfJoinedTables.SqlQuery(sqlQuery, new SqlParameter("username", currentUser)).ToList();
return retval.AsQueryable();
答案 0 :(得分:1)
问题不在于观点。您不能将SQL参数用于表名或列名。
... where @filter = ...
那不行。 必须是文本。只需使用字符串插值来插入它:
var retval = db.v_AViewOfJoinedTables.SqlQuery($"SELECT * FROM dbo.v_AViewOfJoinedTables WHERE {columnname} = @value;",
new SqlParameter("@value", value)).ToList();
SQL执行引擎将缓存您运行的查询的执行计划,但如果查询本身发生更改,则无法执行此操作。例如,该计划可能会根据列名称而更改。因此,SQL参数只能作为提供给查询的值。
您还需要删除@value
周围的单引号。 SQL Server提供程序将为您处理引用插入。