在我正在处理的当前项目中,我经常有一个最多1000个(int
或string
)值的集合,我想在select语句中匹配(使用IN运营商)。该项目支持SQL Server和SQLite。
在SQL Server中,解决方案非常简单。 我创建了两种新类型:
CREATE TYPE IntegerList AS TABLE(IntValue INT NOT NULL);
CREATE TYPE StringList AS TABLE(StrValue VARCHAR(32) NOT NULL);
在我的C#代码中,我执行以下操作:
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = someComplexSelectStatment + " AND T.Value IN (SELECT StrValue FROM @Values)";
SqlParameter parameter = command.CreateParameter() as SqlParameter;
parameter.ParameterName = "@Values";
parameter.Value = data;
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "dbo.StringList";
command.Parameters.Add(parameter);
// use an IDataReader to retrieve the results
}
数据是DataTable
的{{1}}。我编写了自己的通用DbDataReader
,它可以使用DbDataReader
作为来源。
在SQLite中是否有相同的功能?我看到的唯一解决方案(除了将数据插入临时表之外)将创建一个巨大的字符串,如:IEnumerable<T>
。对我来说,这似乎不是一个非常有效的解决方案。
我不能在没有IN运算符的情况下执行select语句(并在集合上过滤结果),因为结果将包含太多结果(最多一百万条记录)。
马克