如何对 DataTable 执行 SELECT DISTINCT

原创 2007年09月27日 16:58:00
在 ADO.NET 1.x & 2.0 中, System.Data.DataTable 类虽然公开 Select 方法,但不支持 DISTINCT 关键字,而我们在实际开发中免不了有这样的需求:对已有 DataTable 进行 SELECT  DISTINCT ,返回指定列具有唯一值的行,这些行存在新的 DataTable 中。

对于此问题,很早就有人提出来了,大家也做了很多尝试。

看到 CSDN 中常有人有此疑问,这里再次总结下,便于参阅。

ADO.NET 1.x
对于此版本,没有任何捷径,只有自己手工实现,这里收集两个比较常用的方法:

Select DISTINCT on DataTable
http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx

HOWTO: VisualC # .NET 中实现 DataSet SELECTDISTINCT Helper 类
http://support.microsoft.com/kb/326176/zh-cn

推荐方法1,此实现更具性能比。


ADO.NET 2.0


对于此版本,  虽然 DataTable.Select 方法依然不支持 DISTINCT ,但是与 DataTable 密切相关的 DataView 类实现了几个重载版本的 ToDataTable  方法,根据现有 DataView 中的行,创建并返回一个新的 DataTable。
其中
public DataTable ToTable (
 bool distinct,
 params string[] columnNames
)





public DataTable ToTable (
 string tableName,
 bool distinct,
 params string[] columnNames
)
支持 distinct 指示是否对 columnNames 内所有列进行 DISTINCT 操作。







private static void DemonstrateDataView()
{
    
// Create a DataTable with three columns.
    DataTable table = new DataTable("NewTable");
    Console.WriteLine(
"Original table name: " + table.TableName);
    DataColumn column 
= new DataColumn("ID"typeof(System.Int32));
    table.Columns.Add(column);

    column 
= new DataColumn("Category"typeof(System.String));
    table.Columns.Add(column);

    column 
= new DataColumn("Product"typeof(System.String));
    table.Columns.Add(column);

    column 
= new DataColumn("QuantityInStock"typeof(System.Int32));
    table.Columns.Add(column);

    
// Add some items.
    DataRow row = table.NewRow();
    row.ItemArray 
= new object[] 1"Fruit""Apple"14 };
    table.Rows.Add(row);

    row 
= table.NewRow();
    row.ItemArray 
= new object[] 2"Fruit""Orange"27 };
    table.Rows.Add(row);

    row 
= table.NewRow();
    row.ItemArray 
= new object[] 3"Bread""Muffin"23 };
    table.Rows.Add(row);

    row 
= table.NewRow();
    row.ItemArray 
= new object[] 4"Fish""Salmon"12 };
    table.Rows.Add(row);

    row 
= table.NewRow();
    row.ItemArray 
= new object[] 5"Fish""Salmon"15 };
    table.Rows.Add(row);

    row 
= table.NewRow();
    row.ItemArray 
= new object[] 6"Bread""Croissant"23};
    table.Rows.Add(row);

    
// Mark all rows as "accepted". Not required
    
// for this particular example.
    table.AcceptChanges();

    
// Print current table values.
    PrintTableOrView(table, "Current Values in Table");

    DataView view 
= new DataView(table);
    view.Sort 
= "Category";
    PrintTableOrView(view, 
"Current Values in View");

    DataTable newTable 
= view.ToTable("UniqueData"true
        
"Category""QuantityInStock");
    PrintTableOrView(newTable, 
"Table created from sorted DataView");
    Console.WriteLine(
"New table name: " + newTable.TableName);

    Console.WriteLine(
"Press any key to continue.");
    Console.ReadKey();
}


private static void PrintTableOrView(DataView dv, string label)
{
    System.IO.StringWriter sw;
    
string output;
    DataTable table 
= dv.Table;

    Console.WriteLine(label);

    
// Loop through each row in the view.
    foreach (DataRowView rowView in dv)
    
{
        sw 
= new System.IO.StringWriter();

        
// Loop through each column.
        foreach (DataColumn col in table.Columns)
        
{
            
// Output the value of each column's data.
            sw.Write(rowView[col.ColumnName].ToString() + "");
        }

        output 
= sw.ToString();
        
// Trim off the trailing ", ", so the output looks correct.
        if (output.Length > 2)
        
{
            output 
= output.Substring(0, output.Length - 2);
        }

        
// Display the row in the console window.
        Console.WriteLine(output);
    }

    Console.WriteLine();
}


private static void PrintTableOrView(DataTable table, string label)
{
    System.IO.StringWriter sw;
    
string output;

    Console.WriteLine(label);

    
// Loop through each row in the table.
    foreach (DataRow row in table.Rows)
    
{
        sw 
= new System.IO.StringWriter();
        
// Loop through each column.
        foreach (DataColumn col in table.Columns)
        
{
            
// Output the value of each column's data.
            sw.Write(row[col].ToString() + "");
        }

        output 
= sw.ToString();
        
// Trim off the trailing ", ", so the output looks correct.
        if (output.Length > 2)
        
{
            output 
= output.Substring(0, output.Length - 2);
        }

        
// Display the row in the console window.
        Console.WriteLine(output);
    }
 //
    Console.WriteLine();
}
 

相关文章推荐

DataTable select() 的使用;DataTabel中distinct用法去重复的的字段或者记录

DataTabel中distinct 在.NET Framework2.0中,选择DataTable等数据源中的唯一值(类似SQL中Distinct的返回结果)非常简单,如下即可: DataT...

Datatable 筛选字段并使用distinct筛选唯一值

 原来DataTable的Distinct竟如此简单! 有时我们需要从DataTable中抽取Distinct数据,以前总是以对DataTable进行foreach之类纯手工方式获取。 近来...
  • liuguobo
  • liuguobo
  • 2014年04月09日 11:09
  • 10831

mysql(二)——select显示、where、%、排序、limit、distinct、count、max等、删和改

(十一)使用select显示 输入: select * fromsales_rep where commission>1; 显示: mysql>select * from sales_rep wher...

mysql中select distinct的用法

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所...

关于select中DISTINCT的技巧和使用

偶然在一个论坛看到了一个关于DISTINCT的技巧和用法.是一个版主写的.觉得可能会对一些人有帮助.所以转载而来.方便大家     以下是转载内容 单表的唯一查询用:disti...

select 语法+别名的使用+连接运算符+distinct+where+like+转义字符+between+in

select 语法 select 【distinct | all 】{* | 表达式 | 【列名,列名,… 】} from {表名| 子查询 } 【别名】 【where conditi...

Oracle-18-select语句初步&SQL中用算术表达式&别名的使用&连接运算符%distinct&where子句

一、一般SELECT语句的格式如下: 1.查询指定表的所有列 select * from 表名 [where 条件] [group by 分组列名] [having 聚合函数] [order...
  • wy_0928
  • wy_0928
  • 2016年04月14日 18:52
  • 5185

hive中select中DISTINCT的技巧和使用

以下是转载内容 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过...

MySQL学习笔记 第六讲:select语句order by、limit、distinct、union

第六讲:select语句order by、limit、distinct、union   1.order by:按照字段值进行排序        ①语法:order by 字段 升序|降序 (asc|d...
  • lhy349
  • lhy349
  • 2013年07月14日 21:00
  • 943

select,distinct,where,betweent,like

1.select   语法:      select  列名称 from  表名称;       或者:       select  * from 表名称; 2.distinct 描述:在表中,可能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何对 DataTable 执行 SELECT DISTINCT
举报原因:
原因补充:

(最多只允许输入30个字)