2009-04-23 8 views
5

Qual è il modo migliore di eseguire una dichiarazione personalizzata sql utilizzando IN da un CQ LinQ a sql datacontext? Ho provato:Datacontext Parametri ExecuteCommand nell'istruzione IN

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

che va bene per 1 articolo passato attraverso la forma, ma se vengo postato attraverso ad esempio "2,1" tanto sono un'eccezione sqlclient:

Conversione non riuscita quando si converte il valore nvarchar '2,1' nel tipo di dati int.

Se invece utilizzo string.format per inserire il parametro funziona bene, ma ovviamente questo è aperto a SQL injection.

risposta

4

LINQ-to-SQL non utilizza la concatenazione; che sarà una query TSQL della forma:

WHERE id IN (@p0) 

con @p0 set di '123,456,789'.

Con LINQ normale è possibile utilizzare Contains. Con ExecuteQuery ci sono alcune opzioni; si potrebbe, ad esempio, passare il CSV "così com'è", e utilizzare un UDF per dividere questo al database e unirsi ad esso:

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} 

Dove dbo.SplitCsv è uno dei molti tali UDF "split" disponibile su Internet.