RSS

Category Archives: ADO.NET

how to get distinct records in datatable?

Following is a code to get the distinct records from datatable:

public static DataTable SelectDistinct(this 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]];
    }

How to call above given function?

//You need to prepare one string array of datatable columns which you want to be unique

string[] fieldNames = { “ServiceProviderName”, “ServiceProviderID” };

/*This extension method created on “DataTable” class. So you need to call this method from your “SourceDataTable” from which you want to select the distinct records. In following code the sourcedatatable is dtSource */
DataTable dt = dtSource.SelectDistinct(fieldNames);

The output of above give code is table “dt” with unique “ServiceProviderNames” and “ServiceProviderIDs”.

Happy Programming!

 

 

 

 
Leave a comment

Posted by on July 9, 2011 in ADO.NET

 

Tags: , ,