public static class DataTableReaderExtension { #region Select Distinct ////// "SELECT DISTINCT" over a DataTable /// /// Input DataTable /// Fields to select (distinct) ///public static DataTable SelectDistinct(this DataTable SourceTable, String FieldName) { return SelectDistinct(SourceTable, FieldName, String.Empty); } /// ///"SELECT DISTINCT" over a DataTable /// /// Input DataTable /// Fields to select (distinct) /// Optional filter to be applied to the selection ///public static DataTable SelectDistinct(this DataTable SourceTable, String FieldNames, String Filter) { DataTable dt = new DataTable(); String[] arrFieldNames = FieldNames.Replace(" ", "").Split(','); foreach (String s in arrFieldNames) { if (SourceTable.Columns.Contains(s)) dt.Columns.Add(s, SourceTable.Columns[s].DataType); else throw new Exception(String.Format("The column {0} does not exist.", s)); } Object[] LastValues = null; foreach (DataRow dr in SourceTable.Select(Filter, FieldNames)) { Object[] NewValues = GetRowFields(dr, arrFieldNames); if (LastValues == null || !(ObjectComparison(LastValues, NewValues))) { LastValues = NewValues; dt.Rows.Add(LastValues); } } return dt; } #endregion #region Private Methods private static Object[] GetRowFields(DataRow dr, String[] arrFieldNames) { if (arrFieldNames.Length == 1) return new Object[] { dr[arrFieldNames[0]] }; else { ArrayList itemArray = new ArrayList(); foreach (String field in arrFieldNames) itemArray.Add(dr[field]); return itemArray.ToArray(); } } /// /// Compares two values to see if they are equal. Also compares DBNULL.Value. /// /// Object A /// Object B ///private static Boolean ObjectComparison(Object a, Object b) { if (a == DBNull.Value && b == DBNull.Value) // both are DBNull.Value return true; if (a == DBNull.Value || b == DBNull.Value) // only one is DBNull.Value return false; return (a.Equals(b)); // value type standard comparison } /// /// Compares two value arrays to see if they are equal. Also compares DBNULL.Value. /// /// Object Array A /// Object Array B ///private static Boolean ObjectComparison(Object[] a, Object[] b) { Boolean retValue = true; Boolean singleCheck = false; if (a.Length == b.Length) for (Int32 i = 0; i < a.Length; i++) { if (!(singleCheck = ObjectComparison(a[i], b[i]))) { retValue = false; break; } retValue = retValue && singleCheck; } return retValue; } #endregion /// /// Checks if a column exists in the DataReader /// /// DataReader /// Name of the column to find ///Returns true if the column exists in the DataReader, else returns false public static Boolean ColumnExists(this IDataReader dr, String ColumnName) { for (Int32 i = 0; i < dr.FieldCount; i++) if (dr.GetName(i).Equals(ColumnName, StringComparison.OrdinalIgnoreCase)) return true; return false; } }
Monday, January 30, 2012
Best Extension Methods: Extensions for Datatable and Datareader
Best Extension Methods for DataTable and DataReader
Share This!
Labels:
C#.NET,
Extension Methods
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment