2009-04-23 14 views
5

¿Cuál es la mejor forma de ejecutar una declaración personalizada sql usando IN desde un C# LinQ a un sql datacontext? He tratado:Parámetros de DataContext ExecuteCommand en la instrucción IN

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

cual está bien para 1 artículo pasa a través de la forma, pero si me sale publicado a través de, por ejemplo, "2,1" cuando me siento un sqlclient excepción:

Error de conversión al convertir el valor nvarchar '2,1' al tipo de datos int.

Si en su lugar utilizo string.format para insertar el parámetro, funciona bien, pero obviamente está abierto a la inyección sql.

Respuesta

4

LINQ-to-SQL no utiliza concatenación; que habrá una consulta TSQL de la forma:

WHERE id IN (@p0) 

con @p0 conjunto de '123,456,789'.

Con LINQ regular puede usar Contains. Con ExecuteQuery hay algunas opciones; Usted podría, por ejemplo, pasar, en el CSV "tal cual", y el uso de una UDF para dividir esto en la base de datos, y unirse a ella:

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} 

Dónde dbo.SplitCsv es uno de los muchos dichos udfs "dividir" disponible en internet.

Cuestiones relacionadas