如何对 DataTable 执行 SELECT DISTINCT
本文转自:http://www.cnblogs.com/jinglecat/archive/2007/07/16/820339.html
有时我们需要从DataTable中抽取Distinct数据,以前总是以对DataTable进行foreach之类纯手工方式获取。
近来发现DataView可以帮我们直接获取Distinct数据,汗一个!
DataSet ds = new DataSet();
ds = GetDS()//自己获得数据源的方法
DataTable dt = ds.Tables[0];
//注:其中ToTable()的第一个参数为是否DISTINCT
DataTable dtDistinct = dt.DefaultView.ToTable(true, new string[] { "A", "B", "C", "D" });
在 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 操作。