2009-04-23 57 views
5

從C#LinQ到sql datacontext使用IN運行自定義sql語句的最佳方式是什麼?我曾嘗試:Datacontext IN語句中的ExecuteCommand參數

db.ExecuteCommand(
    "UPDATE tblCard SET used = 1 WHERE id IN ({0}) AND customer_id = {1}", 
    Request.Form["ids"], customer_id 
); 

這是罰款1項通過的形式通過,但如果我貼過如「2,1」然後我得到一個sqlclient例外:

轉換失敗將nvarchar值'2,1'轉換爲數據類型int時。

如果相反我使用string.format來插入參數它工作正常,但顯然這是開放的SQL注入。

回答

4

LINQ-to-SQL不使用串聯;這將是以下形式的TSQL查詢:

WHERE id IN (@p0) 

@p0設置爲'123,456,789'

對於常規的LINQ,您可以使用Contains。有ExecuteQuery有幾個選項;你可以,例如,通過在CSV「原樣」,並使用UDF在數據庫拆分此,並加入到它:

UPDATE c SET c.used = 1 
FROM dbo.SplitCsv({0}) udf 
INNER JOIN tblCard c 
     ON c.Id = udf.Value 
     AND c.Customer_ID = {1} 

哪裏dbo.SplitCsv是很多這樣的「分裂」的UDF之一可在互聯網上獲得。