使用c#列表中的数据执行Sqlite SELECT,而不在for循环中迭代



我有一个包含(1,2,3,4,5)的c#Listintlist

我在Sqlite数据库中有一个TABLE,它还包含一个带(1,2,3,4,5)的intCOLUMN以及其他字段

如果我在c#中使用sqlite连接运行select,比如:

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

它在<中执行。001秒但它要求我在上面的语句中键入每个值,当我已经在列表中有了这些数据时

因此,如果我迭代列表并运行相同的查询,如:

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

它运行5个单独的选择,耗时>1秒

显然,在大型数据集上,这会被放大到无法迭代和运行所有这些选择的地步。例如,如果我有2000 int。我尝试过在事务中对选择进行批处理,但它根本没有加快速度。

是否有其他方法可以迭代c#列表并在Sqlite选择中使用该列表中的值?所以我不必手动键入所有值,并且可以利用我已经在列表中有值的事实?

您应该使用循环,但要创建命令所需的参数。像这样的线路

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();
....
}

然而,如果你的参数数量开始攀升,我对这个解决方案不是很满意。你谈到了IN子句的2000个值,如果这是真的,我不能确定性能,不仅是这个解决方案的性能,还有具有这么多值的IN子句的整个性能。Crowcoder在其评论中提到的方法可能是另一种解决方案。

最新更新