我可以在View上运行SqlQuery吗?

时间:2017-03-23 19:07:53

标签: c# entity-framework entity-framework-6

所以我有这个问题:

  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();

1 个答案:

答案 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提供程序将为您处理引用插入。