-
DataTable dataTable;
-
-
DataView dataView = dataTable.DefaultView;
-
-
DataTable dataTableDistinct = dataView.ToTable( true,"FieldName1","FieldName2","...");//注:其中ToTable()的第一個參數為是否DISTINCT
-
有時候我們需要對數據表進行篩選,微軟為我們封裝了一個公共方法, 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 DECODE(列名,NULL,'','列本身') FROM 表名(用replace函數在數據庫中替換NULL是無效的)
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading; namespace AroLibraries.ExtensionMethods.Enumerable { public static class IEnumerableExt { public static DataTable Ext_ToDataTable<T>(this IEnumerable<T> varlist) { DataTable dtReturn = new DataTable(); // column names PropertyInfo[] oProps = null; FieldInfo[] oField = null; if (varlist == null) return dtReturn; foreach (T rec in varlist) { // Use reflection to get property names, to create table, Only first time, others will follow if (oProps == null) { oProps = ((Type) rec.GetType()).GetProperties(); foreach (PropertyInfo pi in oProps) { Type colType = pi.PropertyType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof (Nullable<>))) { colType = colType.GetGenericArguments()[0]; } dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); } oField = ((Type) rec.GetType()).GetFields(); foreach (FieldInfo fieldInfo in oField) { Type colType = fieldInfo.FieldType; if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof (Nullable<>))) { colType = colType.GetGenericArguments()[0]; } dtReturn.Columns.Add(new DataColumn(fieldInfo.Name, colType)); } } DataRow dr = dtReturn.NewRow(); if (oProps != null) { foreach (PropertyInfo pi in oProps) { dr[pi.Name] = pi.GetValue(rec, null) ?? DBNull.Value; } } if (oField != null) { foreach (FieldInfo fieldInfo in oField) { dr[fieldInfo.Name] = fieldInfo.GetValue(rec) ?? DBNull.Value; } } dtReturn.Rows.Add(dr); } return dtReturn; } } }