Sqlite SELECT с данными из списка C # без итерации в цикле for? - PullRequest
0 голосов
/ 23 января 2019

У меня есть список c # intlist , который содержит (1,2,3,4,5)

У меня есть TABLE в БД Sqlite, который также содержит int COLUMN с (1,2,3,4,5) и другими полями

Если я запускаю select, используя sqlite-соединение в c #, например:

"SELECT COLUMN, COLUMN2 from TABLE where COLUMN in" + ('1','2','3','4','5');

выполняется через <.001 сек. Но мне нужно ввести каждое значение в инструкцию, как указано выше, когда у меня уже есть эти данные в списке </p>

Так что вместо этого, если я переберу список и выполню тот же запрос, например:

foreach (int i in intlist) {
"SELECT COLUMN, COLUMN2 from TABLE where COLUMN = " + i;
}

Он запускает 5 отдельных выборок и занимает> 1 сек.

Очевидно, что для больших наборов данных это усиливается до такой степени, что становится невозможным перебирать и выполнять все эти выборки. Если у меня есть 2000 дюймов, например. Я пытался пакетировать выборки в транзакциях, и это вообще не ускоряет его.

Есть ли другой способ перебора списка c # и использования значений из этого списка в Sqlite select? Поэтому мне не нужно вводить их все вручную, и я могу воспользоваться тем, что у меня уже есть значения в списке?

Спасибо

1 Ответ

0 голосов
/ 23 января 2019

Вы должны использовать цикл, но для создания параметров, требуемых вашей командой.Что-то вроде этих линий

List<int> intList = new List<int> {1,2,3,4,5};
string cmdText = "SELECT COLUMN, COLUMN2 from TABLE where COLUMN in({0})";
List<SQLiteParameter> prms = new List<SQLiteParameter>();
List<string> placeholders = new List<string>();
int x = 1;
foreach (int n in intList)
{
    prms.Add(new SQLiteParameter {ParameterName = "@p" + x, DbType = DbType.Int32, Value = n});
    placeholders.Add("@p" + x);
    x++;
}
cmdText = string.Format(cmdText, string.Join(",", placeholders));

// At this point your command text looks like
// SELECT COLUMN, COLUMN2 from TABLE where COLUMN in(@p1,@p2,@p3,@p4,@p5)

using(SQLiteConnection con = new SQLiteConnection("Data Source=|DataDirectory|\\mydb.db"))
using(SQLiteCommand g = new SQLiteCommand(cmdText, con))
{
    con.Open();
    g.Parameters.AddRange(prms.ToArray());
    SQLiteDataReader reader = g.ExecuteReader();
    ....
}

Однако мне не очень удобно с этим решением, если число ваших параметров начинает расти.Вы говорите о 2000 значениях для предложения IN, и если это правда, я не могу быть уверен в производительности, не только для этого решения, но и в целом производительности предложения IN с таким количеством значений.Вероятно, подход, упомянутый Crowcoder в его комментарии, может быть другим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...