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

时间:2017-04-25 14:15:05

标签: c# dapper

我有以下代码:

imageAdd

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

怎么可能?有同等的解决方案吗?

3 个答案:

答案 0 :(得分:7)

尝试使用Dapper.DynamicParameters代替SqlParameter数组:

var parameters = new DynamicParameters();
parameters.Add("@ParameterName", parameterValue);

答案 1 :(得分:1)

如果您使用ExecuteNonQuery而不是Query<>,则不会再出现此异常。但是,当您在Oracle中使用Query时,还会出现另一个问题。

我对这个问题的解决方案是使用中间表。我正在使用Oracle; Oracle在sys模式下有一个称为“双重”的特殊表。该表给了我启发,我在用户的模式下创建了另一个表。

CREATE TABLE USER_SCHEMA.DUAL2
(
  DUMMY  VARCHAR2(1000 BYTE)
)
NOCOMPRESS 
NOCACHE
NOPARALLEL;

您可以根据需要延长长度。给了表一些资助。然后,我将查询从select更改为select语句插入。

INSERT INTO USER_SCHEMA.DUAL2
   (SELECT ID
      FROM ANOTHER_SCHEMA.SOME_TABLE
     WHERE SOME_FLAG = 'M' AND NO IN :NO)

这是因为ADO.NET无法从ExecuteNonQuery返回结果。默认情况下,它运行SELECT个查询,但每个查询返回-1。我通过提供INSERT查询来模拟SELECT。这将返回结果。

var parameters = noSplit.Select(x => new { NO = x, SOME_FLAG = flag }).ToList();

var queryResult = dbConnection.Execute(insertSelectQuery, parameters, transactionIfExists);

if (queryResult != parameters.Count)
{
    throw new Exception("Can not find some no");
}

答案 2 :(得分:0)

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

您可以这样做:

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

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

希望有帮助!