您好我在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
如何在数据表上应用过滤器?
答案 0 :(得分:10)
yourdataset.Tables["TableName"].DefaultView.ToTable(true,"disticecolumn");
.ToTable方法中的创建并返回一个新的DataTable 基于现有的行 数据视图。
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");
此代码符合我的要求....谢谢!很多!