IN语句中的Datacontext ExecuteCommand参数

时间:2009-04-23 13:58:28

标签: c# linq command datacontext execute

从C#LinQ到sql datacontext使用sql运行自定义IN语句的最佳方法是什么?我试过了:

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注入开放。

1 个答案:

答案 0 :(得分: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之一。