Как использовать список строк [ ] во вложенном операторе Select в приложении WPF C#
Передача списка string[] для извлечения данных из БД с использованием оператора IN.
Select col1, col2, col3 from tablename where col4 IN (// the list goes here);
Количество элементов в списке может превышать 1000, и, поскольку Oracle не позволяет передавать более 1000 выражений в списке, я ищу альтернативу. Теперь вопросы:
1: я не хочу создавать временную таблицу в БД, потому что у меня недостаточно прав.
2: Не уверен, что несколько IN будет работать, потому что список является динамическим и требование нет. оператор IN может измениться
Вот что я хочу сделать, но не знаю как:
SELECT col1, col2, col3 from tablename where col4 IN (Select col4 from "string[]list";)
Есть ли способ использовать этот список во вложенном операторе select? ИЛИ какая-нибудь другая альтернатива использовать более 1000 выражений, учитывая вышеупомянутые проблемы? Любая помощь будет оценена. Спасибо!
PS Я упростил запрос, чтобы дать представление людям, желающим помочь. Оригинальный запрос намного больше, чем этот!
ОБНОВИТЬ
Поэтому после того, как @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. Я надеюсь, что это может быть полезно для других. Примечание: я открыт для предложений и улучшений, так как я очень новичок в мире программирования.
1 ответ
Итак, давайте предположим, что у вас есть IList<int> items
с 2300 предметов в нем.
Поскольку 1000 пунктов - это предел, давайте разбить его и зациклить
DataTable dt;
int iterator = items.Count / 1000;
int remainder = items.Count % 1000;
for (int i = 0; i < iterator; i++)
{
if (i ==0)
dt = new DataTable();
//Get 1000 items for the in clause
var inStr = string.Join(items.Take(1000).skip(i*1000).ToArray(),',');
// Build the sql query
var query = string.Format("Select col1, col2, col3 from tablename where col4 IN ({0})", inStr);
// Execute the query and add the items to the data table
dt.Merge(// DataTable from the query);
}
var finalIn = string.Join(items.Take(remainder).Skip(iterator*1000).ToArray(), ',');
// Build and execute the query for the final time and add to dt again
dt.Merge(// DataTable from the query);
Если у вас есть строки или что-то еще, то при необходимости измените код.