[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();
}
結果:
第一次
第二次
第三次
DataTable.Select主要在DataTable中執行將符合條件rows複製匯入DataRow Array,
但使用LINQ來查詢過濾DataTable,看來只要比較物件所建立屬性值..等是否相同即可,
透過這小小實驗讓我知道,使用LINQ To DataSet來處理資料過濾搜尋,
在效能上相信會比DataSet.Select來的好很多。