2015-08-29 138 views
-2

我有一個DataTable 1000000條記錄。我正在過濾來自DataTable的記錄。我已經使用各種方法用於過濾:從數據表過濾行

  • DataTable.Select()
  • LINQ到數據表
  • DataView.RowFilter

過濾記載,結合所得的記錄(約1000個記錄。),以列表框後。

整個過程花費很多時間。我分析了代碼,發現過濾花費了很多時間。整個過程應該在毫秒內完成。對於每次過濾,我無法在服務器上獲取記錄。

請建議。

//using dataTable 
DataRow[] dr = dtData.Select("i_pernr=" + perno + ""); 
dr.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges); 

//using DataView 
dtData.DefaultView.RowFilter = "i_pernr=" + perno ; 
dtTemp = dtData.DefaultView.ToTable(); 

//Using Linq 
IEnumerable<DataRow> query = from m in dtData.AsEnumerable() 
          where m["i_pernr"] == perno 
          select m; 
query.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges); 
+3

除非你提供你的代碼,否則我懷疑你在這裏得到任何有用的幫助 – dotnetom

+0

_Lakh_不是印度以外的數字嗎? – TaW

+0

我正在使用此代碼,並且需要大約1秒的時間。 – Dips

回答

0

如果你真的覺得在源過濾是不可能的(SQL Sever的是在選擇記錄好得多),你只可以通過設置PrimaryKey的DataTable的加速選擇操作。

dtData.PrimaryKey = new DataColumn[] { dtData.Columns["i_pernr"]}; 

請注意,您可以將多個列作爲主鍵列。您必須儘可能多地添加以確保您添加/擁有的數據行是唯一的。

我用下面的試驗檯:

var dtTemp = new DataTable(); 
dtTemp.Columns.Add("i_pernr", typeof(int)); 
dtTemp.Columns.Add("name", typeof(string)); 

var dtData = new DataTable(); 
dtData.Columns.Add("i_pernr", typeof(int)); 
dtData.Columns.Add("name", typeof(string)); 
dtData.PrimaryKey = new DataColumn[] { 
    dtData.Columns["i_pernr"], 
    dtData.Columns["name"] 
    }; 

var rnd = new Random(); 
for(int r = 1; r<1000000; r++) 
{ 
    var row =dtData.NewRow(); 
    row[0] = rnd.Next(1000); 
    row[1]= String.Format("the lazy fox jumps again {0}",rnd.Next(10000000)) ; 
    try 
    { 
     dtData.Rows.Add(row); 
    } 
    catch 
    { 
     // Hey, for testing this is fine ... 
    } 
} 

這會加載一個DataTable有足夠的行測試具有或不具有一個的PrimaryKey它秒錶的效果:

dtData.Rows.Count.Dump("rows"); 

var perno = rnd.Next(1000).ToString(); 

var sw = new Stopwatch(); 
sw.Start(); 
DataRow[] dr = dtData.Select("i_pernr=" + perno + ""); 
dr.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges); 
sw.Stop(); 
sw.ElapsedMilliseconds.Dump("elapsed"); 
sw.ElapsedTicks.Dump("ticks"); 

這在使用PrimaryKey時在LinqPad中輸出:

​​

沒有主鍵,結果是:

elapsed:  2,444 
ticks: 7,541,415