我的查询基本上是这样的:
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最终会有一个查询,这会更糟。
答案 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