当我从SQL Server检索数据时,SQL查询窗口中的批量数据(2000000行)需要2分钟。但是使用dapper ORM作为列表进行映射需要很长时间(大约20分钟或更长时间)。
是否有任何想法可以提高映射的性能。
这是我的代码:
public List<T> DapperToList<T>(string SqlQuery, CommandType? CommandType = null) where T : class
{
if (Con.State == ConnectionState.Open)
Con.Close();
Con.Open();
var result = this.Con.Query<T>(SqlQuery, null, null, true, int.MaxValue, CommandType).ToList();
Con.Close();
return result;
}
public List<LOG_REPORTS> REPORT_LOG(DateTime? FROMDATE, DateTime? TODATE)
{
DynamicParameters param = new DynamicParameters();
param.Add("@FROMDATE", FROMDATE, DbType.DateTime);
param.Add("@TODATE", TODATE, DbType.DateTime);
var lstt = db.DapperToList<LOG_REPORTS>("PROC_LOG_REPORTS", param, CommandType.StoredProcedure);
return lstt;
}
答案 0 :(得分:0)
正如您在问题var result = this.Con.Query<T>(SqlQuery,.....)
中所解释的那样,行需要20分钟才能执行。根据您的研究,执行查询需要2分钟,映射需要18分钟。
映射如此庞大的数据需要时间(以及内存和处理器......),并且几乎无法改进这一点。考虑使用ROW_NUMBER
在数据库端进行分页,并一次泵一页。正如你所说,你正在向Excel写入数据;所以这应该不是问题。但这实际上会增加总时间,即使每批次时间减少,应用程序也会响应。
你想写一个Excel,对吗?然后绕过Dapper并使用ADO.NET。将DataTable
传递给Excel编写器模块。这将是巨大的收获。