我有一个应用程序,我使用LINQ在网格视图中加载数据。它有大约200万条记录。为了加载gridview,我能够在gridview中显示数据,但我需要有他们的导出功能。为此,我使用LINQ跳过并采用LINQ查询等过程来批量获取数据。
之后,我正在将LINQ查询转换为数据表,然后进行导出。
以下是将linq查询转换为datatable的代码:
public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
{
DataTable dtReturn = new DataTable();
// column names
PropertyInfo[] oProps = null;
if (varlist == null) return dtReturn;
foreach (T rec in varlist)
{
// Use reflection to get property names, to create table, Only first time, others will follow
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
DataRow dr = dtReturn.NewRow();
foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
(rec, null);
}
dtReturn.Rows.Add(dr);
}
return dtReturn;
}
之后的导出代码如下:
private void ExportToExcel(DataTable dt)
{
try
{
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "CustomReport.xls"));
Response.ContentType = "application/ms-excel";
string str = string.Empty;
foreach (DataColumn dtcol in dt.Columns)
{
Response.Write(str + dtcol.ColumnName);
str = "\t";
}
Response.Write("\n");
foreach (DataRow dr in dt.Rows)
{
str = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
Response.Write(str + Convert.ToString(dr[j]).Replace("\r\n", string.Empty).Trim());
str = "\t";
}
Response.Write("\n");
}
Response.End();
}
catch (Exception ex)
{
}
}
这里的问题如果我按批次导出就像500 000条记录然后两次我能够导出但是当进行第三次500k记录导出然后在 linqToDataTable中出现内存异常方法。
在没有内存不足的情况下,还有其他简单的导出方法吗?