1. 程式人生 > >C# DataTable.Select() 篩選資料 返回新DataRow[]

C# DataTable.Select() 篩選資料 返回新DataRow[]

有時候我們需要對資料表進行篩選,微軟為我們封裝了一個公共方法,DataTable.Select(),其用法如下:

Select()

Select(string filterExpression)

Select(string filterExpression, string sort)

Select(string filterExpression,string sort, DataViewRowState record States)

1)  Select()——獲取所有 System.Data.DataRow 物件的陣列;

2)  Select(string filterExpression)——按照主鍵順序(如果沒有主鍵,則按照新增順序)獲取與篩選條件相匹配的所有 System.Data.DataRow 物件的陣列;

3)  Select(string filterExpression, string sort)——獲取按照指定的排序順序且與篩選條件相匹配的所有System.Data.DataRow 物件的陣列;

4)  Select(string filterExpression, string sort, DataViewRowState recordStates)——獲取與排序順序中的篩選器以及指定的狀態相匹配的所有。

舉例說明:

有一個使用者表,名稱為 dtUsers,有id、姓名name、性別sex、年齡age

1.篩選所有的使用者  

         DataRow[] drs1 =dtUsers.Select();

2.篩選所有性別為男的使用者

         DataRow[] drs2 =dtUsers.Select("sex = '男' ");

3.篩選所有性別為男且年齡在18歲以上的使用者

         DataRow[] drs3 =dtUsers.Select("sex = '男' and age >= 18");

4.篩選所有性別為男或者年齡在18歲以上的使用者

         DataRow[] drs4 =dtUsers.Select("sex = '男' or age >= 18");

5.篩選所有姓“夏”的使用者

         DataRow[] drs5 =dtUsers.Select("name like '夏%'");

6.篩選所有18歲以上的使用者且按從大到小的順序排序

         DataRow[] drs5 =dtUsers.Select("age >=18","age desc");

7.上面最後一種用法沒試過,有機會再列舉出來。


注意事項

1.上面的Select操作是不區分大小寫的(表字段不敏感,如pl-sql語法),如果需要區分大小寫,需要將DataTable的caseSensitive屬性設為true,例如上表的

dtUsers.CaseSensitive = true;//區分大小寫

2.今天做開發發現一個問題,那邊是對空白符的篩選無效,即dt.Select("colnume = ''");經過除錯後發現是因為我的資料來源是從資料庫中查詢的,如下(表名dtOriginal):

我在對PRODUCTUNIT列進行篩選的時候,第一行的“製作一部”篩選出了結果,而後面4行並沒有,因為是資料型別的問題——

解決辦法有兩種,一種是把所有的空白單元格替換成空格字元 ‘’,一種是在資料庫查詢的時候用decode()函式進行替換,例如SELECT isnull([列名],'') as [列名]  FROM 表名。