一次コード最適化を記述する

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);
        }
    }