在Dapper中,此上下文中不允许使用可枚举的参数序列(数组,列表等)

Ken*_*nny 8 c# dapper

我有以下代码:

static void Main(string[] args){
        string sql= "SELECT * FROM Posts WHERE 1=1 ";
        SqlParameter[] @params= SetDynamicParameter(ref sql, "Param=Value", "Param2=Value2", "ParamN=ValueN");

        IDbConnection connection = new SqlConnection(connectionString);
        IEnumerable<Posts> en = connection.Query<Posts>(sql,param:@params);

        Console.ReadKey(true);
}
 static SqlParameter[] SetDynamicParameter(ref string sql,params string[] sarr) {
        string condition = string.Empty;
        List<SqlParameter> list = new List<SqlParameter>();
        foreach (var item in sarr)
        {
            condition += " AND "+item.Split('=')[0] + "=@" + item.Split('=')[0];
            list.Add(new SqlParameter("@" + item.Split('=')[0], item.Split('=')[1]));
        }
        sql += condition;
        return list.ToArray() ;
  }
Run Code Online (Sandbox Code Playgroud)

输出错误:在此上下文中不允许使用可枚举的参数序列(数组,列表等).

它怎么样?有同等的解决方案吗?

小智 9

尝试使用Dapper.DynamicParameters而不是SqlParameter数组:

Dapper.DynamicParameters


小智 6

我知道这对你来说有点晚了,但也许它可以帮助其他人:)

你可以这样做:

public class MySqlDataAccess
{
    string _connectionString = "{your connection string}";

    public async Task<IEnumerable<CustomerDto>> GetListAsync(IList<Guid> customers)
    {
        const string query = @"
            SELECT TOP 100 Id,
                    Name
            FROM Customers
            WHERE Id IN @CustomerIdList
        ";

        using (var c = new SqlConnection(_connectionString))
        {
            return await c.QueryAsync<CustomerDto>(query, new { CustomerIdList = customers.ToArray() });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以WHERE Id IN @CustomerIdList像这样从数组中传递匿名类型:new { CustomerIdList = customers.ToArray() }而不是直接传递数组。

希望能帮助到你!

  • 您可以通过执行“WHERE Id IN @customers”和“await c.QueryAsync&lt;CustomerDto&gt;(query, new {customers });”来缩短它,它应该可以正常工作。 (2认同)