asp.net DataTable相关操作集锦(筛选,取前N条数据,去重复行,获取指定列数据等)
本文实例总结了asp.netDataTable相关操作。分享给大家供大家参考,具体如下:
#regionDataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回
///<summary>
///DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回
///eg:SortExprDataTable(dt,"Sex='男'","TimeDesc",1)
///</summary>
///<paramname="dt">传入的DataTable</param>
///<paramname="strExpr">筛选条件</param>
///<paramname="strSort">排序条件</param>
///<paramname="mode">1,直接用DefaultView按条件返回,效率较高;2,DataTable筛选,排序返回符合条件行组成的新DataTable</param>
publicstaticDataTableSortDataTable(DataTabledt,stringstrExpr,stringstrSort,intmode)
{
switch(mode)
{
case1:
//方法一直接用DefaultView按条件返回
dt.DefaultView.RowFilter=strExpr;
dt.DefaultView.Sort=strSort;
returndt;
case2:
//方法二DataTable筛选,排序返回符合条件行组成的新DataTable
DataTabledt1=newDataTable();
DataRow[]GetRows=dt.Select(strExpr,strSort);
//复制DataTabledt结构不包含数据
dt1=dt.Clone();
foreach(DataRowrowinGetRows)
{
dt1.Rows.Add(row.ItemArray);
}
returndt1;
default:
returndt;
}
}
#endregion
#region获取DataTable前几条数据
///<summary>
///获取DataTable前几条数据
///</summary>
///<paramname="TopItem">前N条数据</param>
///<paramname="oDT">源DataTable</param>
///<returns></returns>
publicstaticDataTableDtSelectTop(intTopItem,DataTableoDT)
{
if(oDT.Rows.Count<TopItem)returnoDT;
DataTableNewTable=oDT.Clone();
DataRow[]rows=oDT.Select("1=1");
for(inti=0;i<TopItem;i++)
{
NewTable.ImportRow((DataRow)rows[i]);
}
returnNewTable;
}
#endregion
#region获取DataTable中指定列的数据
///<summary>
///获取DataTable中指定列的数据
///</summary>
///<paramname="dt">数据源</param>
///<paramname="tableName">新的DataTable的名词</param>
///<paramname="strColumns">指定的列名集合</param>
///<returns>返回新的DataTable</returns>
publicstaticDataTableGetTableColumn(DataTabledt,stringtableName,paramsstring[]strColumns)
{
DataTabledtn=newDataTable();
if(dt==null)
{
thrownewArgumentNullException("参数dt不能为null");
}
try
{
dtn=dt.DefaultView.ToTable(tableName,true,strColumns);
}
catch(Exceptione)
{
thrownewException(e.Message);
}
returndtn;
}
#endregion
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Data;
usingSystem.Collections;
usingSystem.Text;
namespaceGuanEasy
{
///<summary>
///DataSet助手
///</summary>
publicclassDataSetHelper
{
privateclassFieldInfo
{
publicstringRelationName;
publicstringFieldName;
publicstringFieldAlias;
publicstringAggregate;
}
privateDataSetds;
privateArrayListm_FieldInfo;
privatestringm_FieldList;
privateArrayListGroupByFieldInfo;
privatestringGroupByFieldList;
publicDataSetDataSet
{
get{returnds;}
}
#regionConstruction
publicDataSetHelper()
{
ds=null;
}
publicDataSetHelper(refDataSetdataSet)
{
ds=dataSet;
}
#endregion
#regionPrivateMethods
privateboolColumnEqual(objectobjectA,objectobjectB)
{
if(objectA==DBNull.Value&&objectB==DBNull.Value)
{
returntrue;
}
if(objectA==DBNull.Value||objectB==DBNull.Value)
{
returnfalse;
}
return(objectA.Equals(objectB));
}
privateboolRowEqual(DataRowrowA,DataRowrowB,DataColumnCollectioncolumns)
{
boolresult=true;
for(inti=0;i<columns.Count;i++)
{
result&=ColumnEqual(rowA[columns[i].ColumnName],rowB[columns[i].ColumnName]);
}
returnresult;
}
privatevoidParseFieldList(stringfieldList,boolallowRelation)
{
if(m_FieldList==fieldList)
{
return;
}
m_FieldInfo=newArrayList();
m_FieldList=fieldList;
FieldInfoField;
string[]FieldParts;
string[]Fields=fieldList.Split(',');
for(inti=0;i<=Fields.Length-1;i++)
{
Field=newFieldInfo();
FieldParts=Fields[i].Trim().Split('');
switch(FieldParts.Length)
{
case1:
//tobesetattheendoftheloop
break;
case2:
Field.FieldAlias=FieldParts[1];
break;
default:
return;
}
FieldParts=FieldParts[0].Split('.');
switch(FieldParts.Length)
{
case1:
Field.FieldName=FieldParts[0];
break;
case2:
if(allowRelation==false)
{
return;
}
Field.RelationName=FieldParts[0].Trim();
Field.FieldName=FieldParts[1].Trim();
break;
default:
return;
}
if(Field.FieldAlias==null)
{
Field.FieldAlias=Field.FieldName;
}
m_FieldInfo.Add(Field);
}
}
privateDataTableCreateTable(stringtableName,DataTablesourceTable,stringfieldList)
{
DataTabledt;
if(fieldList.Trim()=="")
{
dt=sourceTable.Clone();
dt.TableName=tableName;
}
else
{
dt=newDataTable(tableName);
ParseFieldList(fieldList,false);
DataColumndc;
foreach(FieldInfoFieldinm_FieldInfo)
{
dc=sourceTable.Columns[Field.FieldName];
DataColumncolumn=newDataColumn();
column.ColumnName=Field.FieldAlias;
column.DataType=dc.DataType;
column.MaxLength=dc.MaxLength;
column.Expression=dc.Expression;
dt.Columns.Add(column);
}
}
if(ds!=null)
{
ds.Tables.Add(dt);
}
returndt;
}
privatevoidInsertInto(DataTabledestTable,DataTablesourceTable,
stringfieldList,stringrowFilter,stringsort)
{
ParseFieldList(fieldList,false);
DataRow[]rows=sourceTable.Select(rowFilter,sort);
DataRowdestRow;
foreach(DataRowsourceRowinrows)
{
destRow=destTable.NewRow();
if(fieldList=="")
{
foreach(DataColumndcindestRow.Table.Columns)
{
if(dc.Expression=="")
{
destRow[dc]=sourceRow[dc.ColumnName];
}
}
}
else
{
foreach(FieldInfofieldinm_FieldInfo)
{
destRow[field.FieldAlias]=sourceRow[field.FieldName];
}
}
destTable.Rows.Add(destRow);
}
}
privatevoidParseGroupByFieldList(stringFieldList)
{
if(GroupByFieldList==FieldList)
{
return;
}
GroupByFieldInfo=newArrayList();
FieldInfoField;
string[]FieldParts;
string[]Fields=FieldList.Split(',');
for(inti=0;i<=Fields.Length-1;i++)
{
Field=newFieldInfo();
FieldParts=Fields[i].Trim().Split('');
switch(FieldParts.Length)
{
case1:
//tobesetattheendoftheloop
break;
case2:
Field.FieldAlias=FieldParts[1];
break;
default:
return;
}
FieldParts=FieldParts[0].Split('(');
switch(FieldParts.Length)
{
case1:
Field.FieldName=FieldParts[0];
break;
case2:
Field.Aggregate=FieldParts[0].Trim().ToLower();
Field.FieldName=FieldParts[1].Trim('',')');
break;
default:
return;
}
if(Field.FieldAlias==null)
{
if(Field.Aggregate==null)
{
Field.FieldAlias=Field.FieldName;
}
else
{
Field.FieldAlias=Field.Aggregate+"of"+Field.FieldName;
}
}
GroupByFieldInfo.Add(Field);
}
GroupByFieldList=FieldList;
}
privateDataTableCreateGroupByTable(stringtableName,DataTablesourceTable,stringfieldList)
{
if(fieldList==null||fieldList.Length==0)
{
returnsourceTable.Clone();
}
else
{
DataTabledt=newDataTable(tableName);
ParseGroupByFieldList(fieldList);
foreach(FieldInfoFieldinGroupByFieldInfo)
{
DataColumndc=sourceTable.Columns[Field.FieldName];
if(Field.Aggregate==null)
{
dt.Columns.Add(Field.FieldAlias,dc.DataType,dc.Expression);
}
else
{
dt.Columns.Add(Field.FieldAlias,dc.DataType);
}
}
if(ds!=null)
{
ds.Tables.Add(dt);
}
returndt;
}
}
privatevoidInsertGroupByInto(DataTabledestTable,DataTablesourceTable,stringfieldList,
stringrowFilter,stringgroupBy)
{
if(fieldList==null||fieldList.Length==0)
{
return;
}
ParseGroupByFieldList(fieldList);
ParseFieldList(groupBy,false);
DataRow[]rows=sourceTable.Select(rowFilter,groupBy);
DataRowlastSourceRow=null,destRow=null;
boolsameRow;
introwCount=0;
foreach(DataRowsourceRowinrows)
{
sameRow=false;
if(lastSourceRow!=null)
{
sameRow=true;
foreach(FieldInfoFieldinm_FieldInfo)
{
if(!ColumnEqual(lastSourceRow[Field.FieldName],sourceRow[Field.FieldName]))
{
sameRow=false;
break;
}
}
if(!sameRow)
{
destTable.Rows.Add(destRow);
}
}
if(!sameRow)
{
destRow=destTable.NewRow();
rowCount=0;
}
rowCount+=1;
foreach(FieldInfofieldinGroupByFieldInfo)
{
switch(field.Aggregate.ToLower())
{
casenull:
case"":
case"last":
destRow[field.FieldAlias]=sourceRow[field.FieldName];
break;
case"first":
if(rowCount==1)
{
destRow[field.FieldAlias]=sourceRow[field.FieldName];
}
break;
case"count":
destRow[field.FieldAlias]=rowCount;
break;
case"sum":
destRow[field.FieldAlias]=Add(destRow[field.FieldAlias],sourceRow[field.FieldName]);
break;
case"max":
destRow[field.FieldAlias]=Max(destRow[field.FieldAlias],sourceRow[field.FieldName]);
break;
case"min":
if(rowCount==1)
{
destRow[field.FieldAlias]=sourceRow[field.FieldName];
}
else
{
destRow[field.FieldAlias]=Min(destRow[field.FieldAlias],sourceRow[field.FieldName]);
}
break;
}
}
lastSourceRow=sourceRow;
}
if(destRow!=null)
{
destTable.Rows.Add(destRow);
}
}
privateobjectMin(objecta,objectb)
{
if((aisDBNull)||(bisDBNull))
{
returnDBNull.Value;
}
if(((IComparable)a).CompareTo(b)==-1)
{
returna;
}
else
{
returnb;
}
}
privateobjectMax(objecta,objectb)
{
if(aisDBNull)
{
returnb;
}
if(bisDBNull)
{
returna;
}
if(((IComparable)a).CompareTo(b)==1)
{
returna;
}
else
{
returnb;
}
}
privateobjectAdd(objecta,objectb)
{
if(aisDBNull)
{
returnb;
}
if(bisDBNull)
{
returna;
}
return((decimal)a+(decimal)b);
}
privateDataTableCreateJoinTable(stringtableName,DataTablesourceTable,stringfieldList)
{
if(fieldList==null)
{
returnsourceTable.Clone();
}
else
{
DataTabledt=newDataTable(tableName);
ParseFieldList(fieldList,true);
foreach(FieldInfofieldinm_FieldInfo)
{
if(field.RelationName==null)
{
DataColumndc=sourceTable.Columns[field.FieldName];
dt.Columns.Add(dc.ColumnName,dc.DataType,dc.Expression);
}
else
{
DataColumndc=sourceTable.ParentRelations[field.RelationName].ParentTable.Columns[field.FieldName];
dt.Columns.Add(dc.ColumnName,dc.DataType,dc.Expression);
}
}
if(ds!=null)
{
ds.Tables.Add(dt);
}
returndt;
}
}
privatevoidInsertJoinInto(DataTabledestTable,DataTablesourceTable,
stringfieldList,stringrowFilter,stringsort)
{
if(fieldList==null)
{
return;
}
else
{
ParseFieldList(fieldList,true);
DataRow[]Rows=sourceTable.Select(rowFilter,sort);
foreach(DataRowSourceRowinRows)
{
DataRowDestRow=destTable.NewRow();
foreach(FieldInfoFieldinm_FieldInfo)
{
if(Field.RelationName==null)
{
DestRow[Field.FieldName]=SourceRow[Field.FieldName];
}
else
{
DataRowParentRow=SourceRow.GetParentRow(Field.RelationName);
DestRow[Field.FieldName]=ParentRow[Field.FieldName];
}
}
destTable.Rows.Add(DestRow);
}
}
}
#endregion
#regionSelectDistinct/Distinct
///<summary>
///按照fieldName从sourceTable中选择出不重复的行,
///相当于selectdistinctfieldNamefromsourceTable
///</summary>
///<paramname="tableName">表名</param>
///<paramname="sourceTable">源DataTable</param>
///<paramname="fieldName">列名</param>
///<returns>一个新的不含重复行的DataTable,列只包括fieldName指明的列</returns>
publicDataTableSelectDistinct(stringtableName,DataTablesourceTable,stringfieldName)
{
DataTabledt=newDataTable(tableName);
dt.Columns.Add(fieldName,sourceTable.Columns[fieldName].DataType);
objectlastValue=null;
foreach(DataRowdrinsourceTable.Select("",fieldName))
{
if(lastValue==null||!(ColumnEqual(lastValue,dr[fieldName])))
{
lastValue=dr[fieldName];
dt.Rows.Add(newobject[]{lastValue});
}
}
if(ds!=null&&!ds.Tables.Contains(tableName))
{
ds.Tables.Add(dt);
}
returndt;
}
///<summary>
///按照fieldName从sourceTable中选择出不重复的行,
///相当于selectdistinctfieldName1,fieldName2,,fieldNamenfromsourceTable
///</summary>
///<paramname="tableName">表名</param>
///<paramname="sourceTable">源DataTable</param>
///<paramname="fieldNames">列名数组</param>
///<returns>一个新的不含重复行的DataTable,列只包括fieldNames中指明的列</returns>
publicDataTableSelectDistinct(stringtableName,DataTablesourceTable,string[]fieldNames)
{
DataTabledt=newDataTable(tableName);
object[]values=newobject[fieldNames.Length];
stringfields="";
for(inti=0;i<fieldNames.Length;i++)
{
dt.Columns.Add(fieldNames[i],sourceTable.Columns[fieldNames[i]].DataType);
fields+=fieldNames[i]+",";
}
fields=fields.Remove(fields.Length-1,1);
DataRowlastRow=null;
foreach(DataRowdrinsourceTable.Select("",fields))
{
if(lastRow==null||!(RowEqual(lastRow,dr,dt.Columns)))
{
lastRow=dr;
for(inti=0;i<fieldNames.Length;i++)
{
values[i]=dr[fieldNames[i]];
}
dt.Rows.Add(values);
}
}
if(ds!=null&&!ds.Tables.Contains(tableName))
{
ds.Tables.Add(dt);
}
returndt;
}
///<summary>
///按照fieldName从sourceTable中选择出不重复的行,
///并且包含sourceTable中所有的列。
///</summary>
///<paramname="tableName">表名</param>
///<paramname="sourceTable">源表</param>
///<paramname="fieldName">字段</param>
///<returns>一个新的不含重复行的DataTable</returns>
publicDataTableDistinct(stringtableName,DataTablesourceTable,stringfieldName)
{
DataTabledt=sourceTable.Clone();
dt.TableName=tableName;
objectlastValue=null;
foreach(DataRowdrinsourceTable.Select("",fieldName))
{
if(lastValue==null||!(ColumnEqual(lastValue,dr[fieldName])))
{
lastValue=dr[fieldName];
dt.Rows.Add(dr.ItemArray);
}
}
if(ds!=null&&!ds.Tables.Contains(tableName))
{
ds.Tables.Add(dt);
}
returndt;
}
///<summary>
///按照fieldNames从sourceTable中选择出不重复的行,
///并且包含sourceTable中所有的列。
///</summary>
///<paramname="tableName">表名</param>
///<paramname="sourceTable">源表</param>
///<paramname="fieldNames">字段</param>
///<returns>一个新的不含重复行的DataTable</returns>
publicDataTableDistinct(stringtableName,DataTablesourceTable,string[]fieldNames)
{
DataTabledt=sourceTable.Clone();
dt.TableName=tableName;
stringfields="";
for(inti=0;i<fieldNames.Length;i++)
{
fields+=fieldNames[i]+",";
}
fields=fields.Remove(fields.Length-1,1);
DataRowlastRow=null;
foreach(DataRowdrinsourceTable.Select("",fields))
{
if(lastRow==null||!(RowEqual(lastRow,dr,dt.Columns)))
{
lastRow=dr;
dt.Rows.Add(dr.ItemArray);
}
}
if(ds!=null&&!ds.Tables.Contains(tableName))
{
ds.Tables.Add(dt);
}
returndt;
}
#endregion
#regionSelectTableInto
///<summary>
///按sort排序,按rowFilter过滤sourceTable,
///复制fieldList中指明的字段的数据到新DataTable,并返回之
///</summary>
///<paramname="tableName">表名</param>
///<paramname="sourceTable">源表</param>
///<paramname="fieldList">字段列表</param>
///<paramname="rowFilter">过滤条件</param>
///<paramname="sort">排序</param>
///<returns>新DataTable</returns>
publicDataTableSelectInto(stringtableName,DataTablesourceTable,
stringfieldList,stringrowFilter,stringsort)
{
DataTabledt=CreateTable(tableName,sourceTable,fieldList);
InsertInto(dt,sourceTable,fieldList,rowFilter,sort);
returndt;
}
#endregion
#regionGroupByTable
publicDataTableSelectGroupByInto(stringtableName,DataTablesourceTable,stringfieldList,
stringrowFilter,stringgroupBy)
{
DataTabledt=CreateGroupByTable(tableName,sourceTable,fieldList);
InsertGroupByInto(dt,sourceTable,fieldList,rowFilter,groupBy);
returndt;
}
#endregion
#regionJoinTables
publicDataTableSelectJoinInto(stringtableName,DataTablesourceTable,stringfieldList,stringrowFilter,stringsort)
{
DataTabledt=CreateJoinTable(tableName,sourceTable,fieldList);
InsertJoinInto(dt,sourceTable,fieldList,rowFilter,sort);
returndt;
}
#endregion
#regionCreateTable
publicDataTableCreateTable(stringtableName,stringfieldList)
{
DataTabledt=newDataTable(tableName);
DataColumndc;
string[]Fields=fieldList.Split(',');
string[]FieldsParts;
stringExpression;
foreach(stringFieldinFields)
{
FieldsParts=Field.Trim().Split("".ToCharArray(),3);//allowforspacesintheexpression
//addfieldnameanddatatype
if(FieldsParts.Length==2)
{
dc=dt.Columns.Add(FieldsParts[0].Trim(),Type.GetType("System."+FieldsParts[1].Trim(),true,true));
dc.AllowDBNull=true;
}
elseif(FieldsParts.Length==3)//addfieldname,datatype,andexpression
{
Expression=FieldsParts[2].Trim();
if(Expression.ToUpper()=="REQUIRED")
{
dc=dt.Columns.Add(FieldsParts[0].Trim(),Type.GetType("System."+FieldsParts[1].Trim(),true,true));
dc.AllowDBNull=false;
}
else
{
dc=dt.Columns.Add(FieldsParts[0].Trim(),Type.GetType("System."+FieldsParts[1].Trim(),true,true),Expression);
}
}
else
{
returnnull;
}
}
if(ds!=null)
{
ds.Tables.Add(dt);
}
returndt;
}
publicDataTableCreateTable(stringtableName,stringfieldList,stringkeyFieldList)
{
DataTabledt=CreateTable(tableName,fieldList);
string[]KeyFields=keyFieldList.Split(',');
if(KeyFields.Length>0)
{
DataColumn[]KeyFieldColumns=newDataColumn[KeyFields.Length];
inti;
for(i=1;i==KeyFields.Length-1;++i)
{
KeyFieldColumns[i]=dt.Columns[KeyFields[i].Trim()];
}
dt.PrimaryKey=KeyFieldColumns;
}
returndt;
}
#endregion
}
}
更多关于asp.net相关内容感兴趣的读者可查看本站专题:《asp.net操作json技巧总结》、《asp.net字符串操作技巧汇总》、《asp.net操作XML技巧总结》、《asp.net文件操作技巧汇总》、《asp.netajax技巧总结专题》及《asp.net缓存操作技巧总结》。
希望本文所述对大家asp.net程序设计有所帮助。