C# DataTable抽取Distinct數據(不重復數據)[z]


 

    1. DataTable dataTable;
    2.  
       
    3.  
      DataView dataView = dataTable.DefaultView;
    4.  
       
    5.  
      DataTable dataTableDistinct = dataView.ToTable( true,"FieldName1","FieldName2","...");//注:其中ToTable()的第一個參數為是否DISTINCT
    6.  

 

 

有時候我們需要對數據表進行篩選,微軟為我們封裝了一個公共方法, 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;
        }
   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM