Datatable 篩選欄位並使用distinct篩選唯一值
我想實現如下功能:開啟一個datatable之後,它有9個欄位,我希望篩選其中4個欄位:ABCD,其中有一個欄位A有重複值,我需要用distinct去剔除重複值,
而其他欄位的值是可以重複的。
我在datatable的函式裡找不到相關函式,使用select()函式死活弄不出來,看了網上的帖子也都是相同的問題,才知道:Datatable的select函式相當於
sql語句中的where語句,不能實現我想要的功能。
如果手工去迴圈弄的話也太麻煩了吧,微軟不至於連這麼常用的功能都沒有實現吧,功夫不負有心人!果然在DataView裡找到了。我欣喜若狂!原來DataTable的
篩選欄位和Distinct竟如此簡單! 狂汗一個!
DataTable dataTable = ...; //一個數據表
DataView dataView = dataTable.DefaultView;
DataTable dtnew = dataView.ToTable("distincttablename",true,new string[]{ "Field1","Field2","Field3",...})
這裡面有好幾個函式,第一個引數是設定表名稱,第二個是否為distinct,第三個引數 我自以為是設定你要顯示的是那些欄位,可是看了微軟的幫助才知道不是!!!!。
//
// 摘要:
// 根據現有 System.Data.DataView 中的行,建立並返回一個新的 System.Data.DataTable。
//
// 引數:
// tableName:
// 返回的 System.Data.DataTable 的名稱。
//
// distinct:
// 如果為 true,則返回的 System.Data.DataTable 將包含所有列都具有不同值的行。預設值為 false。
//
// columnNames:
// 一個字串陣列,包含要包括在返回的 System.Data.DataTable 中的列名的列表。DataTable 包含指定的列,其順序與這些列在該陣列中的順序相同。
//
// 返回結果:
// 一個新的 System.Data.DataTable 例項,其中包含所請求的行和列。
所以,我只實現了distinct功能,但是在這裡我不能實現篩選,問題依然存在!!!只能使用linq了?
自從看到DataView的ToTable這幾個函式,我的篩選資料的煩惱立馬消失了!haha
DataView dataView = dtTable.DefaultView;dt = dataView.ToTable(false, this.cmbSoil.Text, this.cmbSilt.Text, this.cmbSand.Text, this.cmbOM.Text, this.cmbS.Text, this.cmbP.Text);
DataTable dt2 = dataView.ToTable(true, this.cmbSoil.Text);
//group r by r.Field<string>(this.cmbSoil.Text) group r by new { t1 = r.Field<DateTime>(this.cmbSoil.Text) } where true
// join r2 in dt2.AsEnumerable()
//on r.Field<string>(this.cmbSoil.Text) equals
//r2.Field<string>(this.cmbSoil.Text)
var query =
(
from r2 in dt2.AsEnumerable()
join r in dt.AsEnumerable()
on r2.Field<string>(this.cmbSoil.Text) equals r.Field<string>(this.cmbSoil.Text)
select new{
col1 = r2.Field<string>(this.cmbSoil.Text),
col2 = r.Field<Int32>(this.cmbS.Text)
});
DataTable table = new DataTable();
table.Columns.Add("Price", typeof(string));
table.Columns.Add("Genre", typeof(string));
// table = query.CopyToDataTable<DataRow>(table,LoadOption.OverwriteChanges);