0

我的一种方法有问题,需要 4-5 分钟来初始化约 17,000 个 poco 对象并用它们填充列表。我试图避免对查询中的数据进行分页,因此需要初始化 ~17,000。我们正在使用 Oracle DB 和 Microsoft.Practices.EnterpriseLibrary 来调用 DB。不确定该信息是否相关,但以防万一。我正在使用 ExecuteReader 方法的 reader 对象来设置 Poco 类的 60 个属性。我不确定为什么要花这么长时间。查询大约需要 3-5 秒来执行。因此,任何关于如何更改代码以加快速度的建议将不胜感激。另外,有人告诉我查询是在 reader.Read() 调用上执行的,而不是在 ExecuteReader() 调用上执行的。我不认为这是正确的,但如果有人知道' 如果是的话,你能告诉我吗?再次感谢。

POCO 类

public class BaseWorkItem : ITransactionWorkItem  
{  
    public int Prop1 { get; set; }  
    public string Prop2 { get; set; }
    ....  

    public ITransactionWorkItem SetValues(IDataReader reader)
    {
        Prop1 = reader["Prop1"] != DBNull.Value ?
            Convert.ToInt32(reader["Prop1"]) : -1;
        Prop2 = reader["Prop2"] != DBNull.Value ?
            reader["Prop2"].ToString() : "";  
        ....  
        return this;
    }
}

数据访问和初始化方法

static IEnumerable<ITransactionWorkItem> GetQueue_WorkItems<T>(IDataReader reader)
    where T : ITransactionWorkItem, new()
{
    if (reader.IsNotNull())
    {
        while (reader.Read())
        {
            yield return (T)(new T().SetValues(reader));
        }
    }
}

public static List<ITransactionWorkItem> GetItems(int param1, int param2,
    int param3, int param4)
{
    Database oracle = null;
    IDataReader reader = null;
    var items = new List<ITransactionWorkItem>();

    oracle = Oracle.GetDatabase();

    using (reader = oracle.ExecuteReader("SomeProcedureName", param1, param2,
        param3, param4, null))
    {
        items.AddRange(GetQueue_WorkItems<BaseWorkItem>(reader));
    }

    return items;
}
4

0 回答 0