Создайте строку, изменяя переменную на каждой итерации цикла и объединяя их все

#c#

Вопрос:

Мне нужно построить свой sql-запрос, который в основном лежит в его основе, похож на следующее:

 select something from {myCurrentTable} where some condition
 

Этот запрос должен быть повторен N раз, когда N неизвестно, и заключен в объединение.

Мне нужно изменять значение myCurrentTable каждой итерации, поэтому я бы сделал что-то вроде этого:

 foreach(string table in myTables)
{
    queryTot  = $"SELECT something from {table} where some condition";
    if(!lastIteration)
       queryTot  = " union ";
}
 

Есть ли какая-либо функция, которую я могу использовать, чтобы избавиться от явного цикла?

Комментарии:

1. Есть ли причина, по которой вам нужно избавиться от цикла? Вы уже думали об string.Join(" UNION ", ...) этом ?

2. Как бы то ни было, вместо этого вы можете захотеть UNION ALL UNION : последнее дедуплицирует результаты.

3. @BurnsBA в основном потому, что я хочу сделать часть функции, над которой я работаю, менее «многословной»

4. Кроме того, что плохого в использовании цикла в первую очередь? Любой код, который вы используете (например string.Join , ответ ниже), внутренне все еще использует цикл.

5. Что приятно в использовании string.Join , так это то, что вам не нужно беспокоиться о проверке последней итерации, и это также работает с одной таблицей :). При циклическом подходе необходимо учитывать и то, и другое.

Ответ №1:

Вы можете использовать LINQ Select для проецирования таблиц в select операторы SQL, а затем string.Join добавить a union между каждым из них:

 string query = string.Join(
    " union ",
    myTables.Select(table => $"SELECT something from {table} where some condition"));
 

Использование string.Join вместо ручного цикла означает, что union буквы s вставляются правильно без необходимости проверять последнюю итерацию или проверять myTables , содержит ли коллекция только один элемент.

Комментарии:

1. Большое спасибо. Я использовал строку. Присоединяйтесь в прошлом, но я не думал, что смогу объединиться с LINQ Select.

2. @DanieleSartori Select возвращает IEnumerable<string> здесь и string.Join имеет перегрузку , которая принимает IEnumerable<string> в качестве второго аргумента.

Ответ №2:

Если вы объединяете строки в цикле с неопределенным числом, вам следует рассмотреть возможность использования StringBuilder вместо обычной строки.

Поскольку строка является неизменяемым типом данных в C#, при объединении двух или более строк создается новая строка. Если вы добавите ряд символов в строку (как в вашем примере), вы несколько раз воссоздадите одну и ту же строку в памяти..

Альтернативным подходом является изменение экземпляра StringBuilder, которое не приводит к созданию нового экземпляра в памяти, поэтому рекомендуется в описываемом случае.