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

4

我有一个查询,大致如下:

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

我想通过 IDbDataParameter 把 ID 列表作为单个参数传递,查询语句的格式如下:

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

然后只需要一个参数,就是一个列表,而不需要像这样做:

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

我知道其他数据提供程序可以实现这一点,但我能否使用标准的System.Data类来完成呢?
顺便说一下,我希望将它作为一个单一的列表参数而不是一系列参数,因为随着参数数量的变化,MySQL将视查询为新查询,我们会失去一些缓存优化。这也是我不想只是将基本SQL作为字符串进行操作的原因,因为那样我最终会得到每个值一个查询,这会更糟糕。

2
我不知道这是否回答了你的问题,但为什么不使用params[] int ids呢? - alexn
@alexn:这是关于ADO.NET命令参数的问题,与方法无关。 - Pavel Minaev
1
这些问题有帮助吗?http://stackoverflow.com/search?q=parameterize+in+clause - Greg
@Greg,他们都指向我要走的方向,即循环并制作单独的参数。我希望有一种参数类型本身就是列表,但似乎并非如此。 - ryber
我知道 :( 看起来是一个不错的功能。 - Greg
4个回答

2

是否可以使用:

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

在创建并填充数组后,您可以按照需要执行以下操作:
SELECT foo
FROM bar
where bar.Id in (string.Join(", ", myParameters));

我不完全确定那是否是你所询问的内容,但这是我从你的帖子中理解到的。


不完全是,那将是对查询的直接字符串操作。这很容易,但我正在寻找将列表制作为带有正确IDbDataParameter对象的预准备语句。 - ryber

0

我不确定你是否在谈论LINQ,但如果是的话,你应该将其翻转并使用Contains()。

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

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

据我所知,SQL根本无法接受数组作为函数/过程的参数,因此我怀疑缓存的执行计划甚至能否表达数组的概念。

如果您有合理数量的项目,您可以为每个参数计数的sproc“超载”,直到某个数字,超过该数字将是常规的动态方式。

StuffWithList1 one
StuffWithList2 one two
StuffWithList3 one two three

或者,只需

StuffWithList one two three four five six seven eight nine ten eleven ... twenty

并且对于不需要的参数传递null:

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

不,我没有使用LINQ,只是来自.NET 1的古老ADONet类,特别是IDbDataParameter。 - ryber
啊,好的,抱歉。至少带有许多参数的StuffWithList对您仍然有效。 - Jason Kleban

0

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

我使用的是MS Sql Server,因此不确定在MYSQL中是否可能。 如果可能,希望像这样:

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

该函数创建一个表格,其中每个值在分隔列表中都有一列和一行。 不知道这是否可以在mysql中完成。


0
您可以传入一个带有分隔符的列表,并使用表变量函数将该列表“拆分”为行。
我在这里发布了一个示例链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接