如何在 WPF C# 应用程序的嵌套 Select 语句中使用字符串 [] 列表

How to use a string[ ] list in a nested Select statement in WPF C# application

传递 string[] list 以使用 IN 运算符从数据库检索数据。

Select col1, col2, col3 from tablename where col4 IN (// the list goes here);

列表中的项数可以超过 1000,因为 Oracle 不允许在列表中传递超过 1000 个表达式,我正在寻找替代方法。现在的问题:

1: 我不想在数据库中创建临时 table 因为我没有足够的权限。

2:不确定多个 IN 是否有效,因为列表是动态的并且没有要求。 IN 运算符可以更改

所以这是我想做但不知道怎么做的事情:

SELECT col1, col2, col3 from tablename where col4 IN (Select col4 from "string[]list";)

有没有办法在嵌套的 select 语句中使用此 list? 或者在考虑上述问题的同时使用超过 1000 个表达式的任何其他替代方法? 任何帮助,将不胜感激。谢谢!

P.S。我简化了查询以向愿意提供帮助的人们提供想法。原来的查询远不止这些!

更新

所以在@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....";

所以最后我找到了一个解决方案,我可以将我的列表分成 多个列表 并将它们分别传递给 multiple IN 运算符。我希望它对其他人有用。 注意:由于我对编程世界还很陌生,所以我乐于接受建议和改进。

所以假设您有一个 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);

如果您有字符串或其他内容,请根据需要修改代码。