C # / SQL Повторное использование параметра для списка значений - PullRequest
0 голосов
/ 12 сентября 2018

Как мне сгенерировать SqlCommand для списка параметров?
Как правильно использовать один и тот же параметр с новым предложением OR?

public class InputList
{
    public string col1 { get; set; }
    public string col2 { get; set; }
}

public void Exec(IList<InputList> list)
{
   try
   {
       using (var conn = new SqlConnection(Settings.Default.DBConnStr))
       using (var cmd = conn.CreateCommand())
       {
           conn.Open();
           cmd.CommandType = CommandType.Text;

           // want to use SqlParameter to prevent sql injection
           var clause = list
                           .Select(x => $"(col1 = {x.col1} AND col2 = {x.col2}) OR ")
                           .Aggregate((curr, next) => curr + " " + next);
           // TODO: remove trainling OR

           cmd.CommandText =
               $@"SELECT *
                  FROM T
                  WHERE {clause}";

           // TODO: execute reader
        }
   }
   catch()
}

Мне нужно перебрать список объектов для компиляции предложения WHERE

SELECT *
FROM T
WHERE
(col1 = @col1 AND col2 = @col2) OR
(col1 = @col1 AND col2 = @col2) OR
...
(col1 = @col1 AND col2 = @col2)

1 Ответ

0 голосов
/ 13 сентября 2018

Мне не удалось найти решение для моего первоначального запроса, но табличные параметры (TVP) хорошо подходят для моего случая.
Спасибо @JeroenMostert за напоминание о TVP

Мне пришлось переделать мой запрос и переместить предложения из WHERE в раздел INNER JOIN
SELECT * FROM T INNER JOIN @TVP TVP ON TVP.col1 = T.col1 AND TVP.col2 = T.col2

Это не будет работать, если вам не разрешено создавать TVP в базе данных

...