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});
来缩短它;,它应该也可以正常工作。