zoukankan      html  css  js  c++  java
  • 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;
            }
       }
    }
    
  • 相关阅读:
    搭建Elasticsearch 5.4分布式集群
    Elasticsearch中Head插件的使用
    Elasticsearch6.0及其head插件安装
    elasticsearch 6.2.3安装ik分词
    linux安装elasticsearch
    [Elasticsearch] 多字段搜索 (三)
    [Elasticsearch] 全文搜索 (一)
    [Elasticsearch] 多字段搜索 (二)
    elasticsearch this is not a http port
    基于visual Studio2013解决C语言竞赛题之0704字符串长度
  • 原文地址:https://www.cnblogs.com/jjj250/p/10551227.html
Copyright © 2011-2022 走看看