C# 填充列表的最有效方法<;int>;通过ADO.NET调用存储过程
我正在通过ADO.NET调用一个存储过程,如下所示(简化形式)。该数据库是一个MySQL数据库。 存储过程返回一个ID值列表,这些ID值对应于需要重新安排调用时间的调用。 C代码将它们存储在一个列表中 我的问题是:有没有一种更有效的方法将值放入C#list,而不是像我现在这样使用DataReader? 我还不知道我这样做是否对我们的应用程序来说效率太低(这将在测试期间确定),我只是在寻找一种更快的策略,如果存在的话 我研究了如何使用数据集,但据我所知,如果ID-s列表很大(可能很大),则速度可能会较慢。 另外,根据我所读到的,LINQ可能也会慢一些 我只需要将列表存储到callsToRescheduleList中;也就是说,我不需要对ID-s进行任何随机访问,所以不需要数据集的那些特性。 我只是在寻找最快的方法将数据放入列表中 有什么建议吗 C#代码: MySQL存储过程:C# 填充列表的最有效方法<;int>;通过ADO.NET调用存储过程,c#,mysql,stored-procedures,ado.net,C#,Mysql,Stored Procedures,Ado.net,我正在通过ADO.NET调用一个存储过程,如下所示(简化形式)。该数据库是一个MySQL数据库。 存储过程返回一个ID值列表,这些ID值对应于需要重新安排调用时间的调用。 C代码将它们存储在一个列表中 我的问题是:有没有一种更有效的方法将值放入C#list,而不是像我现在这样使用DataReader? 我还不知道我这样做是否对我们的应用程序来说效率太低(这将在测试期间确定),我只是在寻找一种更快的策略,如果存在的话 我研究了如何使用数据集,但据我所知,如果ID-s列表很大(可能很大),则速度可能
CREATE PROCEDURE `spPhy_GetCallsToRescheduleListPreviousDays` ()
BEGIN
SELECT
id
FROM callrequest
WHERE
dialerCampaignId = 'CATH001’
AND
status = 'SCHEDULED’
;
END
好吧,这是最好的选择——选择范围很窄,在紧循环中使用读卡器顺序重载也很好 一些检查:
- 确保MySql中的
上有索引(键)——我假设这里的(dialerCampaignId,status)
dialerCampaignId有更好的选择性
<> LI>如果您的代码< >清单>代码>消费者不会每次迭代完整列表,作为将数据滚动到列表中的一种选择,也考虑使用枚举和收益返回:
public IEnumerable GetCallsToRescheduleListPreviousDays()
{
使用(var cmd=new MySqlCommand)
(
“`phytel`.`spPhy\u GetCallsToRescheduleListPreviousDays`,
(MySqlConnection)数据库连接,workerTransaction
)
{
cmd.CommandType=CommandType.storedProcess;
使用(var reader=cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
产生返回读取器GetInt32(0);
}
}
}
}
}
还要记住处置
IDisposable
资源,如命令
和读卡器
您可以查看类似ORM的实体框架或NHibernate
CREATE PROCEDURE `spPhy_GetCallsToRescheduleListPreviousDays` ()
BEGIN
SELECT
id
FROM callrequest
WHERE
dialerCampaignId = 'CATH001’
AND
status = 'SCHEDULED’
;
END
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);
}
}
}
}
}