【问题标题】:Most efficient way to populate List<int> via ADO.NET call to stored procedure通过 ADO.NET 调用存储过程来填充 List<int> 的最有效方法
【发布时间】:2015-01-07 04:30:06
【问题描述】:

我正在通过 ADO.NET 调用存储过程,如下所示(简化形式)。该数据库是 MySQL 数据库。 存储过程返回一个 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

【问题讨论】:

  • 你可以查看像实体框架或 NHibernate 这样的 ORM

标签: c# mysql stored-procedures ado.net


【解决方案1】:

AFAIK 已经达到了最好的水平 - 选择范围很窄,并且在紧密循环中使用阅读器序号重载是好的。

一些检查:

  • 确保在 MySql 中 (dialerCampaignId, status) 上有一个索引(键) - 我假设这里的 dialerCampaignId 有更好的选择性。
  • 如果您的 List&lt;Int&gt; 消费者有可能不会每次都迭代完整列表,作为将数据滚动到列表中的替代方法,请考虑使用可枚举和收益返回:

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 资源,例如CommandsReaders

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2018-10-13
    • 2015-04-26
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多