Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper中在此上下文中不允许使用可枚举的参数序列(数组、列表等)_C#_Dapper - Fatal编程技术网

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

C# Dapper中在此上下文中不允许使用可枚举的参数序列(数组、列表等),c#,dapper,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 SqlC

我有以下代码:

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() ;
  }
static void Main(字符串[]args){
string sql=“从1=1的帖子中选择*”;
SqlParameter[]@params=SetDynamicParameter(参考sql,“Param=Value”、“Param2=Value2”、“ParamN=ValueN”);
IDbConnection=newSQLConnection(connectionString);
IEnumerable en=connection.Query(sql,param:@params);
Console.ReadKey(true);
}
静态SqlParameter[]SetDynamicParameter(引用字符串sql,参数字符串[]sarr){
字符串条件=string.Empty;
列表=新列表();
foreach(sarr中的var项目)
{
条件+=”和“+item.Split('=”)[0]+“=@”+item.Split('=')[0];
添加(新的SqlParameter(“@”+item.Split('=')[0],item.Split('=')[1]);
}
sql+=条件;
return list.ToArray();
}
输出错误:在此上下文中不允许枚举参数序列(数组、列表等)


怎么可能?有没有等效的解决方案?

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

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

如果使用
ExecuteNonQuery
而不是
Query
,您将不再获得此异常。但在Oracle中使用查询时会出现另一个问题

我解决这个问题的方法是使用中间表。我用的是甲骨文;Oracle有一个名为“dual”的特殊表,它位于
sys
schema下。这个表给了我灵感,我在用户的模式下创建了另一个表

CREATE TABLE USER_SCHEMA.DUAL2
(
  DUMMY  VARCHAR2(1000 BYTE)
)
NOCOMPRESS 
NOCACHE
NOPARALLEL;
如果你愿意,你可以延长长度。给桌子一些补助金。然后,我将select语句的查询从select改为INSERTENT

INSERT INTO USER_SCHEMA.DUAL2
   (SELECT ID
      FROM ANOTHER_SCHEMA.SOME_TABLE
     WHERE SOME_FLAG = 'M' AND NO IN :NO)
这是因为ADO.NET无法从
ExecuteOnQuery
返回结果。默认情况下,它运行
SELECT
查询,但每个查询返回-1。我通过提供
SELECT
查询来模拟
INSERT
。这将返回一个结果

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

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

您可以这样做:

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() });
        }
    }
}
公共类MySqlDataAccess
{
字符串_connectionString=“{your connection string}”;
公共异步任务GetListAsync(IList客户)
{
常量字符串查询=@“
选择前100个Id,
名称
来自客户
@CustomerIdList中的何处Id
";
使用(var c=newsqlconnection(_connectionString))
{
return wait c.QueryAsync(查询,new{CustomerIdList=customers.ToArray()});
}
}
}
在@CustomerIdList中执行
WHERE Id
操作,然后像这样从数组中传入匿名类型:
new{CustomerIdList=customers.ToArray()}
,而不是直接传递数组


希望有帮助

这是因为Dapper需要一组属性和值,而不是sql参数列表。我认为您可以创建一个
字典
,其中键是参数名(不带@),值是要设置为参数的值。这个想法是Dapper为您创建属性。您可能会在这个stackoverflow线程中找到一些东西。[您可以通过在@customers中执行
whereid
wait c.QueryAsync(query,new{customers});
来缩短它;,它应该也可以正常工作。