C# 如何在.NET中将列表作为参数传递

C# 如何在.NET中将列表作为参数传递,c#,mysql,ado.net,C#,Mysql,Ado.net,我有一个基本上是这样的查询: SELECT foo FROM bar where bar.Id in (1,2,3); SELECT foo FROM bar where bar.Id in (?id1, ?id2, ?id3); 我想通过IDbDataParameter将Id列表作为单个参数传入,其中设置了查询的格式: SELECT foo FROM bar where bar.Id in (?ListOfID); 然后使用一个列表参数,而不必执行以下操作: SELECT foo FRO

我有一个基本上是这样的查询:

SELECT foo
FROM bar
where bar.Id in (1,2,3);
SELECT foo
FROM bar
where bar.Id in (?id1, ?id2, ?id3);
我想通过IDbDataParameter将Id列表作为单个参数传入,其中设置了查询的格式:

SELECT foo
FROM bar
where bar.Id in (?ListOfID);
然后使用一个列表参数,而不必执行以下操作:

SELECT foo
FROM bar
where bar.Id in (1,2,3);
SELECT foo
FROM bar
where bar.Id in (?id1, ?id2, ?id3);
我知道这在其他数据提供程序中是可能的。我可以用标准的System.data类来实现吗

另外,我之所以希望它是一个单一的列表参数而不是一系列参数,是因为随着参数数量的变化,MySQL会将查询视为新的,并且我们会放松一些缓存优化。MySQl基本上以每个ID的一个查询结束。这与我不想将基本SQl作为字符串进行操作的原因是一样的,因为这样一来,我最终会得到每个变量一个查询,这会更糟。

是否可以使用:

string[] myParamaters = new string[2];
myParameters[0] = "id1"
myParameters[1] = "id2"
创建阵列并按所需方式填充后:

SELECT foo
FROM bar
where bar.Id in (string.Join(", ", myParameters));

我不完全确定你是否在问这个问题,但我想这是我从你的帖子中理解的。

如果我理解正确,你希望在查询中传入一个参数,并将其拆分为可以与“in”运算符一起使用的内容。我过去所做的是使用一个字符串参数并用逗号分隔的列表分隔符填充它,然后创建一个sql函数将逗号分隔的列表转换为一个表。我将sql函数输出的表与“IN”运算符一起使用

我使用的是MS Sql Server,所以不确定这在MYSQL中是否可行。如果是的话,我想

选择foo 从酒吧 其中,SELECT*FROM CONVERTTOTABLE FUNCTION或ROC DelimitedList中的条Id,分隔符


该函数为分隔列表中的每个值创建一个包含一列和一行的表。不知道这是否可以在mysql中完成。

您可以传入一个带分隔符的列表,并使用表变量函数将列表“拆分”为行


我已经发布了一个示例。

我不清楚您是否在谈论LINQ,但如果您在谈论LINQ,您应该将其翻转过来并使用Contains

var whatever = from bar in bars
               where ListOfID.Contains(bar.Id)
               select bar;
是的,列表被转换为动态sql,但至少您不必自己处理转义/字符串操作

据我所知,sql根本不能接受数组作为函数/进程的参数,因此我怀疑缓存执行计划是否能够表达数组的概念

如果您有一个合理的项目数量,您可以为每个参数计数重载存储过程,直到达到某个数量,超过这个数量将是常规的动态方式

StuffWithList1 one
StuffWithList2 one two
StuffWithList3 one two three
或者,只是

StuffWithList one two three four five six seven eight nine ten eleven ... twenty
并为不需要的参数传递空值:

StuffWithList 8 9 3 null null null null null null null null ... null

我不知道这是否回答了你的问题,但为什么不使用params[]int-ids?@alexn:这是关于ADO.NET命令参数的,根本不是关于方法的。这些问题有帮助吗@格雷格:他们都指向我要去的方向,那就是循环并生成单个参数。我希望有一个param类型本身就是一个列表,但事实并非如此。我知道:这似乎是一个很好的特性。不完全是,这将是查询的直接字符串操作。这很容易,但我希望使列表成为一个带有适当IDbDataParameter对象的准备好的语句,而不是使用LINQ,只使用.Net 1中的旧ADO.Net类,特别是IDbDataParameterAh ok抱歉。至少有很多参数的StuffWithList仍然适用于您。