2017-02-15 15 views
0

Передача строка [] 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 операторов. Надеюсь, это может быть полезно для других. Примечание: Я открыт для предложений и улучшений, так как я очень новичок в мире программирования.

+0

Если значений поиска более 1K, разделите их партиями значений 1k и выполните запрос несколько раз (с каждой партией)? – ASh

+0

@ASh Проблема в том, что это не просто запрос, но и запросы на получение наборов информации из db. Это уже довольно сложно, и я не хочу идти на компромисс в отношении производительности, повторяя запросы. Но я думаю, это единственное возможное решение. Спасибо tho :) – Zak29

ответ

0

Так что давайте предположим, что у вас есть 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); 

Если у вас есть строки или что-то еще, то изменить код по мере необходимости.

+0

Спасибо @Barry O'Kane Я пытаюсь использовать вашу идею, но вместо этого реализую ее с ** IEnumerable **. Если я не найду желаемого решения, мне придется придерживаться этого. – Zak29

+0

Альтернативой до тех пор, пока Т наследует от объекта, было бы добавить параметры для каждого элемента в предложение 'IN' и добавить строку параметров в' inStr'. Дайте мне знать, если вы хотите, чтобы ответ был обновлен, чтобы отразить это. –

+0

Я обновил свой пост своим решением. Не стесняйтесь критиковать :) – Zak29

 Смежные вопросы

  • Нет связанных вопросов^_^