Параметры Datacontext ExecuteCommand в операторе IN - PullRequest
5 голосов
/ 23 апреля 2009

Каков наилучший способ запуска пользовательского оператора sql с использованием IN из C # LinQ в sql datacontext? Я пробовал:

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 Ответ

4 голосов
/ 23 апреля 2009

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, доступных в Интернете.

...