C# 使用关键字c参数化查询

C# 使用关键字c参数化查询,c#,orm,C#,Orm,我所在的应用程序中没有编写参数化Sql查询。下面是代码块 public List<MyClass> GetData(int Id, IEnumerable<string> state) { using (var dataContext = new DataContext(_connectionString)) { var query = new StringBuilder("SELECT * F

我所在的应用程序中没有编写参数化Sql查询。下面是代码块

  public List<MyClass> GetData(int Id, IEnumerable<string> state)
    {
        using (var dataContext = new DataContext(_connectionString)) 
            {
            var query = new StringBuilder("SELECT * FROM table");
            query.Append(" Id = ");
            query.Append(Id);
            query.Append(" AND state IN ('");
            query.Append(string.Join("','", state));
            query.Append("')");

            return dataContext.ExecuteQuery<MyClass>(query.ToString()).ToList();
     }
对于状态,我将数据视为“错误”、“警告”。 在SQLServer中,我像这样运行查询

   SELECT * FROM table   WHERE Id =34 AND state IN ('error','warning').
我需要在mystate周围移动吗?我尝试使用trim方法删除并将其分配回string,但没有成功。我仍然可以看到双引号

  myStates = myStates.trim('"');

如何在不使用任何字符串生成器的情况下更好地参数化我的查询

我认为您应该更改传递参数的方式:

return dataContext.ExecuteQuery<MyClass>(query, Id, stateString).ToList();

为了便于参考,请查看此方法的签名,可以找到。

要参数化in子句,每种情况都必须是一个单独的参数。因此,in条款必须反映这一点

见类似问题:


另一个建议:整洁

int x = ...;
int[] y = ...
var items = connection.Query<MyClass>(
   "SELECT * FROM table WHERE X = @x AND Y in @y", new {x,y}).AsList();

Dapper将为您处理此问题,对0、1或许多项使用适当的查询,包括填充参数的可选配置选项,以避免查询计划饱和。因此,当您有大型列表时,您对47项、48项和49项使用相同的查询和查询计划,但可能对50项使用不同的查询,如果您的服务器支持,请使用string_split。

当我进行上述更改时,我得到了类似“error”的结果,“警告”。错误单词前面没有单引号。我已经更正了答案,包括开头和结尾的单引号。我按照你说的做了。我仍然没有得到任何结果。我没有考虑参数是如何转义的,修改了我的答案以反映单个参数。我在一个遗留应用程序中,我没有自由使用任何新的东西。我的问题有什么解决办法?@sameer我建议给制定“不要使用任何新东西”规则的人一记耳光——我怀疑这会解决很多问题——警告:这太夸张了——实际上不要这样做
return dataContext.ExecuteQuery<MyClass>(query, Id, stateString).ToList();
public List<MyClass> GetData(int Id, IEnumerable<string> state)
{
    using (var dataContext = new DataContext(_connectionString))
    {
        var stateParameterNumbers = Enumerable.Range(1, state.Count())
            .Select(i => string.Format("{{{0}}}", i));

        var stateParameterString = string.Join(",", stateParameterNumbers);

        string query = "SELECT * FROM table WHERE Id ={0} AND state IN (" + stateParameterString + ")";
        return dataContext.ExecuteQuery<MyClass>(query, new object[] { Id }.Concat(state).ToArray()).ToList();
    }
}
int x = ...;
int[] y = ...
var items = connection.Query<MyClass>(
   "SELECT * FROM table WHERE X = @x AND Y in @y", new {x,y}).AsList();