【发布时间】:2014-10-06 13:27:17
【问题描述】:
我有一个名为 ListTypes 的列表,其中包含 10 种产品。下面的存储过程循环并获取正在循环的产品的每条记录,并将其存储在 ListIds 列表中。这正在杀死我的 sql 框,因为我有超过 200 个用户整天不断地执行它。
我知道循环 sql 语句不是一个好的架构,但这是我让它工作的唯一方法。有什么想法我可以在不循环的情况下做到这一点吗?也许是一个 Linq 声明,我从来没有使用过这么大的 Linq。谢谢。
protected void GetIds(string Type, string Sub)
{
LinkedIds.Clear();
using (SqlConnection cs = new SqlConnection(connstr))
{
for (int x = 0; x < ListTypes.Count; x++)
{
cs.Open();
SqlCommand select = new SqlCommand("spUI_LinkedIds", cs);
select.CommandType = System.Data.CommandType.StoredProcedure;
select.Parameters.AddWithValue("@Type", Type);
select.Parameters.AddWithValue("@Sub", Sub);
select.Parameters.AddWithValue("@TransId", ListTypes[x]);
SqlDataReader dr = select.ExecuteReader();
while (dr.Read())
{
ListIds.Add(Convert.ToInt32(dr["LinkedId"]));
}
cs.Close();
}
}
}
【问题讨论】:
-
列表中总是10个项目吗?
-
@DavidG 是动态的,所以它可以是 10、15 或 8。
-
为什么不在数据集中有这个并将数据集对象分配给 var 对象?或者您也可以继续使用 datareader 并将 datareader 对象分配给 var 对象
var dr= select.ExecuteReader(); -
一点优化:在循环之外创建 SqlCommand 及其参数一次。然后在循环内设置这些参数的值并执行。在整个循环中保持连接打开。
-
将 ListTypes 放入数据表并(一次)传递给期望表变量的 sp? (codeproject.com/Tips/214492/…)
标签: c# sql performance linq