1. 程式人生 > >Datatable 篩選欄位並使用distinct篩選唯一值

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