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

时间:2009-09-21 17:48:06

标签: c# mysql ado.net

我的查询基本上是这样的:

SELECT foo
FROM bar
where bar.Id in (1,2,3);

我想将Id的列表作为单个参数传递给IDbDataParameter,其中格式化查询:

SELECT foo
FROM bar
where bar.Id in (?ListOfID);

然后有一个列表,而不是必须做这样的事情:

SELECT foo
FROM bar
where bar.Id in (?id1, ?id2, ?id3);

我知道在其他数据提供程序中可以使用标准的System.Data类来实现这一点吗?

P.S。我希望它作为单个列表参数而不是一系列参数的原因是因为随着params数量的变化,MySQL会将查询视为新的并且我们放弃了一些缓存优化。 MySQl基本上以每个ID的一个查询结束。这与我不想将基本SQl作为字符串操作的原因相同,因为那样每个VAULE最终会有一个查询,这会更糟。

4 个答案:

答案 0 :(得分:2)

是否可以使用:

string[] myParamaters = new string[2];
myParameters[0] = "id1"
myParameters[1] = "id2"

创建数组并按照您的需要填充后:

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

我不完全确定这是不是你问的问题,但这是我认为你从帖子中理解的内容。

答案 1 :(得分:0)

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

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

那样

SELECT foo 从酒吧 bar.Id in(SELECT * FROM ConvertToTableFunctionOrProc(?DelimitedList,?Delimiter));

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

答案 2 :(得分:0)

您可以传入分隔列表并使用表变量函数将列表“拆分”为行。

我发布了一个示例here

答案 3 :(得分:0)

我不清楚你是在谈论LINQ,但如果你是,你应该翻转它并使用Contains()。

var whatever = from bar in bars
               where ListOfID.Contains(bar.Id)
               select bar;

是的,列表转换为动态sql,但至少你不必自己处理转义/字符串操作。

据我所知,sql根本不能接受数组作为函数/ ​​procs的参数,所以我怀疑缓存的执行计划是否甚至可以表达数组的想法。

如果你有一个合理数量的项目,你可以为每个参数计数“重载”一个特定数量的sproc,超过这个数量就会成为常规的动态方式。

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