Передача строка [] list для извлечения данных из db с использованием В операторе.Как использовать строку [] в вложенном элементе Select в приложении WPF C#
Select col1, col2, col3 from tablename where col4 IN (// the list goes here);
Количество элементов в списке может превышать 1000, а с Oracle не позволяет передать более 1000 выражений в списке, я ищу альтернативу. Теперь проблемы:
1: Я не хочу создавать временную таблицу в БД, потому что у меня недостаточно привилегий.
2: Не уверен, что несколько INs будут работать, потому что список динамический и требование нет. из В оператор может изменить
Так вот что я хочу сделать, но не знаю, как:
SELECT col1, col2, col3 from tablename where col4 IN (Select col4 from "string[]list";)
Есть ли способ использовать этот список в вложен выберите заявление? ИЛИ любая другая альтернатива использованию более 1000 выражений при одновременном уважении вышеупомянутых проблем? Любая помощь будет оценена по достоинству. Спасибо !
P.S. Я упростил запрос, чтобы дать идею людям, желающим помочь. Исходный запрос намного больше!
UPDATE
Таким образом, после @Barry O'Kane показал мне способ обойти это, я придумал следующее решение:
IEnumerable<string> List = arrExcelItems; //arrExcelItems is the actual list with more than 1000 expressions
IList<IEnumerable<string>> listofLists = new List<IEnumerable<string>>();
List<string> listtoQuery = new List<string>();
string strCompList = null;
string extQuery = null;
string extQuery = null; string Query = "Select col1, col2, col3 from tablename where col4 IN ";
for (int i = 0; i < List.Count(); i += 20)
{
listofLists.Add(List.Skip(i).Take(20).ToList()); //Adding every 20 items of list to the listoflists[i] index
for (int j = 0; j < listofLists.Count; j++) //possibility of improving OR removing this for loop and use only string.Join method.
{
strCompList = string.Join("','", listofLists[j].ToArray());
}
strCompList = "('" + strCompList + "')"; //concatenating every list in listofLists[i] for IN operator
arrList.Add(strCompList);
}
for (int i = 0; i < listtoQuery.Count; i++)
{
extquery = string.Join(" OR IN ", listtoQuery); //
}
Query += extQuery;
//resultant query after concatenation
Query = "Select col1, col2, col3 from tablename where col4 IN listtoQuery[0] OR col4 IN listtoquery[1] OR col4 IN....";
Итак, наконец, я узнал, что решение, в котором Я могу разбить мой список на несколько списков и передать их каждому несколько IN операторов. Надеюсь, это может быть полезно для других. Примечание: Я открыт для предложений и улучшений, так как я очень новичок в мире программирования.
Если значений поиска более 1K, разделите их партиями значений 1k и выполните запрос несколько раз (с каждой партией)? – ASh
@ASh Проблема в том, что это не просто запрос, но и запросы на получение наборов информации из db. Это уже довольно сложно, и я не хочу идти на компромисс в отношении производительности, повторяя запросы. Но я думаю, это единственное возможное решение. Спасибо tho :) – Zak29