我正在通过ADO.NET调用存储过程,如下所示(简化形式)。该数据库是一个MySQL数据库。 存储过程返回一个ID值列表,这些ID值对应于需要重新调度其调用时间的调用。 C#代码将它们存储在列表中。
我的问题是:是否有更有效的方法将值输入C#列表,而不是像我一样使用DataReader? 我还不知道我这样做的方式是否对我们的应用来说效率太低(将在测试期间确定),我只是在寻找更快的策略,如果存在的话。
我看过使用DataSet,但是从我读过的内容来看,如果ID-s列表很大(可能是这样),那可能会慢一些。 另外,从我读过的内容来看,LINQ也可能更慢。
我只需要将列表存储到callsToRescheduleList中;即,我不需要对ID-s进行任何随机访问,因此不需要DataSet的那些功能。 我只是想找到将数据放入列表的最快方法。
有什么建议吗?
C#代码:
private void GetCallsToRescheduleList()
{
MySqlCommand cmd = new MySqlCommand
(
"`phytel`.`spPhy_GetCallsToRescheduleListPreviousDays`",
(MySqlConnection) DatabaseConnection, workerTransaction
);
cmd.CommandType = CommandType.StoredProcedure;
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while( reader.Read())
{
callsToRescheduleList.Add(reader.GetInt32(0));
}
}
}
MySQL存储过程:
CREATE PROCEDURE `spPhy_GetCallsToRescheduleListPreviousDays` ()
BEGIN
SELECT
id
FROM callrequest
WHERE
dialerCampaignId = 'CATH001’
AND
status = 'SCHEDULED’
;
END
答案 0 :(得分:0)
AFAIK的效果与它一样好 - 选择范围很窄,在紧密循环中使用读取器序数过载是好的。
一些检查:
(dialerCampaignId, status)
上有索引(键) - 我假设此处dialerCampaignId
有更好的选择性。List<Int>
消费者每次都不会迭代完整列表,作为将数据滚动到列表中的替代方法,请考虑使用可枚举和收益率返回:
public IEnumerable<int> GetCallsToRescheduleListPreviousDays()
{
using (var cmd = new MySqlCommand
(
"`phytel`.`spPhy_GetCallsToRescheduleListPreviousDays`",
(MySqlConnection) DatabaseConnection, workerTransaction
)
{
cmd.CommandType = CommandType.StoredProcedure;
using (var reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while( reader.Read())
{
yield return reader.GetInt32(0);
}
}
}
}
}
另请注意处理IDisposable
资源,例如Commands
和Readers