2 回答
TA贡献1853条经验 获得超6个赞
让 SQL Server 完成所有肮脏的工作。像这样的东西。
var SQL0 = "SELECT * FROM [database] WHERE material_id IN (select value from string_split('{0}',','))";
var idList = new List<int> { 11, 53, 125};
int[] idListArray = idList.ToArray();
sqlCommand.CommandText = String.Format(SQL0, string.Join(",", idListArray));
// now execute the command
编辑
更安全、更高效的方式。
var SQL0 = "SELECT * FROM [database] WHERE material_id IN (select value from string_split(@ids,','))";
var idList = new List<int> { 11, 53, 125};
int[] idListArray = idList.ToArray();
sqlCommand.CommandText = SQL0;
sqlCommand.Parameters.Add("@ids", SqlDbTypes.VarChar, -1).Value = string.Join(",", idListArray);
// now execute the command
TA贡献1853条经验 获得超18个赞
您不能以这种方式传递参数数组。EF6 中的SqlQuery有一个重载,它接受 SqlParameter 数组作为第二个参数。
你所要做的就是:
SqlParameter[] pms = sqlCommand.Parameters.Cast<SqlParameter>().ToArray();
var datainput = context.materials.SqlQuery(sqlCommand.CommandText, pms);
当然,这也意味着您当前的许多代码是不必要的,您可以将其丢弃
例如,您可以在没有仅用于存储参数和命令文本的 SqlCommand 对象的情况下编写此代码。
var SQL0 = "SELECT * FROM [database] WHERE material_id IN ({0})";
var idList = new List<int> { 11, 53, 125 };
var idParameterList = new List<string>();
var pms = new List<SqlParameter>();
int count = 1;
foreach (var id in idList)
{
var paramName = "@idParam" + count++;
SqlParameter p = new SqlParameter(paramName, SqlDbType.Int);
p.Value = id;
pms.Add(p);
idParameterList.Add(paramName);
}
string cmdText = String.Format(SQL0, string.Join(",", idParameterList));
var datainput = context.materials.SqlQuery(cmdText, pms);
- 2 回答
- 0 关注
- 210 浏览
添加回答
举报