一次コード最適化を記述する
23047 ワード
一次コード最適化を記述する
一、原データ処理データベースからデータを取得し、dt(タイプDatable)に格納し、データ量は三万五千本程度であり、peojectIDはページがバックグラウンドに伝わるカンマで区切られ、単引用符を付けた文字列である.1.次の方法でデータソースを最初にフィルタリングします.(このメソッドは8秒程度実行されています)
DataTable newdt = new DataTable();
newdt = dt.Clone(); // dt , dt , ;
if (!String.IsNullOrEmpty(projectID)) {
DataRow[] rows = dt.Select("GroupID In (" + projectID + ")"); // dt ;
foreach (DataRow row in rows) // dt ;
{
newdt.Rows.Add(row.ItemArray);
}
dt = newdt;
}
2.プロジェクトIDを巡回し、データソースから当該プロジェクトのデータを検出して処理する(この方法は50秒程度実行した)
string[] groups = Request["ProjectID"].Split(',');
foreach (string groupID in groups) {
if (!string.IsNullOrEmpty(groupID)) {
DataView wbsView = dt.DefaultView;
//
wbsView.RowFilter = "GroupID=" + groupID;
DealData(wbsView, newDt);
}
}
3、データソースを処理し、GetNodeContent方法はhtmlをつづる
public void DealData(DataView wbsView, DataTable newDt)
{
if (wbsView.Count > 0)
{
var row1 = newDt.NewRow();
DataTable dtTmp = wbsView.ToTable();
row1["CorpID"] = dtTmp.Rows[0]["CorpID"];
row1["ProjectID"] = dtTmp.Rows[0]["ProjectID"];
row1["ProjectName"] = dtTmp.Rows[0]["ProjectName"];
row1["GroupID"] = dtTmp.Rows[0]["GroupID"];
row1["GroupName"] = dtTmp.Rows[0]["GroupName"];
row1["ModID"] = dtTmp.Rows[0]["ModID"];
row1["ModName"] = dtTmp.Rows[0]["ModName"];
foreach (DataRow datarow in dtTmp.Rows)
{
//
string codeNo = datarow.Field<string>("CodeNo");
if (!string.IsNullOrEmpty(codeNo))
{
var tempRows = milestoneNodes.Select("Sort = " + codeNo);
if (tempRows.Length > 0)
{
var index = tempRows[0].Field<string>("MilestoneNode");
row1[index] = GetNodeContent(datarow);
}
}
}
newDt.Rows.Add(row1);
}
}
二、最適化後のデータ処理
Linq文を使用してグループ化し、グループ化されたデータを二重にループします.Linqの強力な機能により、データ処理にかかる時間を1秒以内に短縮.
public void DealDataNew(DataTable dt, string ProjectIDs, DataTable newDt)
{
var groups = ProjectIDs.Replace("'", "").Split(',');
//
var data = from tempData in dt.AsEnumerable()
join groupID in groups on tempData.Field<string>("GroupID") equals groupID
group tempData by tempData.Field<string>("GroupID");
foreach (var item in data) {
var row1 = newDt.NewRow();
var firstRow = item.FirstOrDefault();
row1["CorpID"] = firstRow["CorpID"];
row1["ProjectID"] = firstRow["ProjectID"];
row1["ProjectName"] = firstRow["ProjectName"];
row1["GroupID"] = firstRow["GroupID"];
row1["GroupName"] = firstRow["GroupName"];
row1["ModID"] = firstRow["ModID"];
row1["ModName"] = firstRow["ModName"];
foreach (var row in item) {
//
string codeNo = row.Field<string>("CodeNo");
if (!string.IsNullOrEmpty(codeNo)) {
var tempRows = milestoneNodes.Select("Sort = " + codeNo);
if (tempRows.Length > 0) {
var index = tempRows[0].Field<string>("MilestoneNode");
row1[index] = GetNodeContent(row);
}
}
}
newDt.Rows.Add(row1);
}
}