我在内存中有200万行数据,我想应用动态groupby和dynamic where(动态过滤器)子句。我需要最多10秒的记录。我试过这样做:
动态Linq,它工作正常,但返回结果超过60秒,这是不可接受的。
我使用了数据表并应用了过滤器和计算功能,它在20-30秒内返回数据。
是否有任何其他数据结构,库或某些方法/算法可用于加速此查询以使用动态组合和动态过滤器工具在10秒或更短时间内获得结果。
我的数据包含以下字段
"Company"
"City"
"SellPrice"
"BuyPrice"
我正在Company
和City
字段上动态分组,并在price
字段上执行聚合功能
并将其称为:
public DataTable GroupBy(string[] gorupByColumns, string aggregateColumn, DataTable table, string columnName, string Formula, string whereClause)
{
bool IsNoGroupIng = false;
DataTable d;
if (!string.IsNullOrEmpty(whereClause))
{
table.DefaultView.RowFilter = whereClause;
d = table.DefaultView.ToTable();
table.DefaultView.RowFilter = "";
table = table.DefaultView.ToTable();
}
else
{
d = table.DefaultView.ToTable();
}
DataView dv = new DataView(d);
DataTable dtGroup = null;
if (gorupByColumns.Length ==1 && string.IsNullOrWhiteSpace(gorupByColumns[0]))
{
dtGroup = dv.ToTable();
IsNoGroupIng = true;
}
else
{
dtGroup = dv.ToTable(true, gorupByColumns);
}
if (columnName.ToLower() == "sum")
{
dtGroup.Columns.Add(columnName, typeof(double));
}
else
{
dtGroup.Columns.Add(columnName, typeof(double));
}
foreach (DataRow dr in dtGroup.Rows)
{
if (IsNoGroupIng)
{
dr[columnName] = d.Compute(Formula, "");
break;
}
string operation = string.Empty;
for (int i = 0; i < dtGroup.Columns.Count -1; i++)
{
if (i>0)
{
operation += " AND ";
}
operation += dtGroup.Columns[i].ColumnName + " = '" + dr[i] + "'";
}
dr[columnName] = d.Compute(Formula, operation);
}
if (IsNoGroupIng && dtGroup.Rows.Count > 0)
{
DataTable dTable = new DataTable();
dTable.Columns.Add(columnName, typeof(double));
DataRow row = dTable.NewRow();
row[columnName] = dtGroup.Rows[0][columnName];
dTable.Rows.Add(row);
return dTable;
}
return dtGroup;
}
GroupBy(arr,“Price”,dt,“MyCustomColumn”,“Sum(Price)”,“Country IN('Country1.Country2')”);