[C#][LINQ]LINQ To DataSet

  • 19491
  • 0
  • C#
  • 2010-09-09

[C#][LINQ]LINQ To DataSet

大家對DataSet這物件一定不陌生,DataSet可說是整個ADO.NET Client資料處理核心,

在LINQ未出現以前,我們快取 DB 資料至DataSet/DataTable後,

即可對DataSet/DataTable進行資料過濾搜尋,而不需要再連接後端資料庫,算是較有效率的作法,

可惜在資料過濾搜尋方面無法處理太複雜的運算作業,

然而LINQ支援較複雜的搜尋運算作業(如拆解欄位部分內容執行更精細運算、擷取某欄位部分字串內容..等),

這篇就簡單測試比較DataSet.Select和LINQ To DataSet兩者效能。

 

假設DB Table資料已快取至DataTable(記憶體)後,將執行搜尋DataTable取得符合過濾條件資料的總筆數。

 

TestControl.cs

 public string TestByQryDataSet(QryMethod QryType,int rowcount)
        {
            TableNopt_Qtpls tabqtpls = new TableNopt_Qtpls();
            DataTable dt = tabqtpls.GetData( rowcount );
            string QryResult = string.Empty;
            string FinallResult = string.Empty;
            if( dt != null && dt.Rows.Count > 0 )
            {
                Stopwatch sw = new Stopwatch();
                sw.Reset();
                sw.Start();
                switch( QryType )
                {
                    case QryMethod.LinqtoDS:
                      QryResult= LinqToDS(dt);
                        break;
                    case QryMethod.DSSelect:
                     QryResult= DsSelect(dt);
                        break;
                    default:
                        QryResult = "未執行任何查詢!";
                        break;
                }
                sw.Stop();
                FinallResult = string.Format( "搜尋筆數:{0},花費時間(ms):{1}", QryResult, sw.ElapsedMilliseconds.ToString() );
            }             
            return FinallResult;
        }
 
        private string LinqToDS(DataTable sourcedt)
        {
            IEnumerable<DataRow> myrows = from c in sourcedt.AsEnumerable()
                                          where c.Field<string>( "BILL_NO" ).StartsWith( "H" ) && 
                                          c.Field<string>( "BILL_NO_TYPE" ) == "H"                                          
                                          select c;                 
            return string.Format( "{0}", myrows.Count().ToString() );               
        }
 
        private string DsSelect( DataTable sourcedt )
        {                
            DataRow[] myrows = sourcedt.Select( "BILL_NO LIKE 'H%' AND BILL_NO_TYPE='H'" );             
            return string.Format( "{0}", myrows.Count().ToString() );
        }

 

 

TestControl類別中,公開TestByQryDataSet方法和兩個私有方法(LinqToDS、DsSelect)。

 

LinqToDS.aspx.cs


  protected void Button1_Click( object sender, EventArgs e )
        {
            TestControl testcontrol = new TestControl();
            StringBuilder sb = new StringBuilder();

            //DataSet.Select
            //過濾DataSet(Total:1000rows),取得符合條件資料。
            sb.AppendLine( "DataSet.Select " + 
                testcontrol.TestByQryDataSet( TestControl.QryMethod.DSSelect, 1000 ) );
            //過濾DataSett(Total:10000rows),取得符合條件資料。
            sb.AppendLine( "DataSet.Select " + 
                testcontrol.TestByQryDataSet( TestControl.QryMethod.DSSelect, 10000 ) );
            //過濾DataSett(Total:100000rows),取得符合條件資料。
            sb.AppendLine( "DataSet.Select " +
                testcontrol.TestByQryDataSet( TestControl.QryMethod.DSSelect, 100000 ) );
            TextBox1.Text = sb.ToString();
           
            sb.Clear();

            //Linq to DataSet
            sb.AppendLine( "Linq to DataSet " +
                testcontrol.TestByQryDataSet( TestControl.QryMethod.LinqtoDS, 1000 ) );
            sb.AppendLine( "Linq to DataSet " +
                testcontrol.TestByQryDataSet( TestControl.QryMethod.LinqtoDS, 10000 ) );
            sb.AppendLine( "Linq to DataSet " +
                testcontrol.TestByQryDataSet( TestControl.QryMethod.LinqtoDS, 100000 ) );
            TextBox1.Text += sb.ToString();
        }

 

 


結果:

第一次

image

 

第二次

image

 

第三次

image

 

DataTable.Select主要在DataTable中執行將符合條件rows複製匯入DataRow Array,

但使用LINQ來查詢過濾DataTable,看來只要比較物件所建立屬性值..等是否相同即可,

透過這小小實驗讓我知道,使用LINQ To DataSet來處理資料過濾搜尋,

在效能上相信會比DataSet.Select來的好很多。