2009-09-21 17 views
4

我有一個查詢,基本上是這樣的:如何通過一個列表作爲PARAM在.NET

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

我想通過標識在列表中與IDbDataParameter一個param其中查詢格式化:

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

,然後有一個PARAM這是一個名單,而不是必須做這樣的事情:

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

我知道這是可能的其他數據提供者可以用標準的System.Data類來做到這一點嗎?

P.S.我希望它作爲單個列表參數而不是一系列參數的原因是因爲隨着參數數量的變化,MySQL會將查詢視爲新的並且我們放棄了一些緩存優化。 MySQl基本上以每個ID的一個查詢結束。這同樣是因爲我不想將字符串SQl作爲基本SQl操作,因爲那樣我最終會得到每個VAULE的一個查詢,這會更糟糕。

+2

我不知道這是否回答你的問題,但爲什麼不使用PARAMS [] INT IDS? – alexn 2009-09-21 17:49:53

+0

@alexn:這是關於ADO.NET命令參數的,而不是關於方法的。 – 2009-09-21 18:09:52

+1

有沒有這些問題有幫助? http://stackoverflow.com/search?q=parameterize+in+clause – Greg 2009-09-21 19:50:17

回答

2

是否有可能使用:

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

創建數組和填充它後你怎麼想:

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

我不能完全肯定,如果這是你問的是什麼,但這是我認爲我從你的帖子中瞭解到的。

+0

不完全,這將是直接的字符串操縱的查詢。這很容易,但我希望使列表準備好的語句與正確的IDbDataParameter對象 – ryber 2009-09-21 18:08:43

0

如果我理解正確,您希望將一個參數傳遞給您的查詢,並將其分解爲可與'IN'運算符一起使用的內容。我過去所做的是使用一個字符串參數,並填充逗號分隔列表(分隔符可以是任何),然後創建一個SQL函數將逗號分隔列表轉換爲表格。我使用了'IN'運算符從sql函數輸出的表格。

我正在使用MS Sql Server,所以不確定這是否可以在MYSQL中使用。如果是想有點像

SELECT富 FROM酒吧 其中bar.Id在(SELECT * FROM ConvertToTableFunctionOrProc(DelimitedList,分隔符)?);

該函數爲分隔列表中的每個值創建一列和一行表。不知道這是否可以在MySQL中完成。

0

您可以傳入分隔列表並使用表變量函數將列表「拆分」爲行。

我已經發布了一個示例here

0

我不清楚你是否在談論LINQ,但如果你是,你應該翻轉它並使用Contains()。

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

是,列表轉換爲動態SQL,但至少你不必亂用你自己的轉義/字符串操作左右。

據我所知,sql不能接受數組作爲函數/ ​​procs的參數,所以我懷疑緩存的執行計劃是否可以表達數組的想法。

如果你有一個合理數量的項目,你可以「超載」每一個參數的計數達到一定的數量,超過它將是常規的動態方式。

StuffWithList1 one 
StuffWithList2 one two 
StuffWithList3 one two three 

OR,只是

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 
+0

不,不使用LINQ,只是.NET 1中的ye-olde ADO.Net類,特別是IDbDataParameter – ryber 2009-09-22 11:32:48

+0

啊,好的,對不起。至少StuffWithList有許多參數仍然適用於你。 – 2009-09-22 16:55:59

相關問題