#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, которое не приводит к созданию нового экземпляра в памяти, поэтому рекомендуется в описываемом случае.