ASP.NET:从Data表中过滤唯一的行

时间:2009-08-14 05:09:44

标签: c# c#-2.0

您好我在asp.net中使用数据表。我无法获得如何从数据表中过滤唯一数据。

问题描述如下

Data Table:
Consumer No Date             Value
ABC001           1st Aug 09 1
ABC001           1st Aug 09 2
ABC001           2nd Aug 09 1
XYZ001           1st Aug 09 1
XYZ002           1st Aug 09 1
XYZ002           1st Aug 09 2

我想根据在第一列和第二列上应用的过滤器来跟踪输出。在输出中,我们可以看到第一列和第二列的唯一组合。

Consumer No Date             
ABC001           1st Aug 09 
ABC001           2nd Aug 09 
XYZ001           1st Aug 09 
XYZ002           1st Aug 09

如何在数据表上应用过滤器?

5 个答案:

答案 0 :(得分:10)

yourdataset.Tables["TableName"].DefaultView.ToTable(true,"disticecolumn");
  

创建并返回一个新的DataTable   基于现有的行   数据视图。

.ToTable方法中的

true指定返回的DataTable包含对其所有列具有不同值的行。

来自msdn文章

<强> 编辑:

从可以使用“不同”关键字的数据库中执行此操作会更容易。

答案 1 :(得分:3)

显然没有办法在DataTable的Select()方法上应用DISTINCT过滤器。

但是,您可以使用以下代码行创建新的DataTable:

DataTable filterTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date");

这应该返回符合您要求的不同行!

归功于DevPinoy.org

答案 2 :(得分:0)

private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames)
{
     object[] lastValues;
     DataTable newTable;
     DataRow[] orderedRows;

     if (FieldNames == null || FieldNames.Length == 0)
          throw new ArgumentNullException("FieldNames");

     lastValues = new object[FieldNames.Length];
     newTable = new DataTable();

     foreach (string fieldName in FieldNames)
          newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);

     orderedRows = SourceTable.Select("", string.Join(", ", FieldNames));

     foreach (DataRow row in orderedRows)
     {
          if (!fieldValuesAreEqual(lastValues, row, FieldNames))
          {
               newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));

               setLastValues(lastValues, row, FieldNames);
          }
     }

     return newTable;
}

private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
     bool areEqual = true;

     for (int i = 0; i < fieldNames.Length; i++)
     {
          if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]]))
          {
               areEqual = false;
               break;
          }
     }

     return areEqual;
}

private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
     foreach (string field in fieldNames)
          newRow[field] = sourceRow[field];

     return newRow;
}

private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
     for (int i = 0; i < fieldNames.Length; i++)
          lastValues[i] = sourceRow[fieldNames[i]];
}

来源:http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx

答案 3 :(得分:0)

您可以使用LINQ执行以下操作:

var resultSet = (from r in dt.AsEnumerable() 
    select r["ConsumerNo"]).Distinct().ToList(); 

查看帖子Using LINQ to manipulate DataTable's data

最好的Rgds

答案 4 :(得分:0)

DataTable filteredTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date");

此代码符合我的要求....谢谢!很多!