71 lines
2.3 KiB
C#
71 lines
2.3 KiB
C#
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using DataTable = System.Data.DataTable;
|
|
|
|
namespace Kreta.BusinessLogic.Utils
|
|
{
|
|
/// <summary>
|
|
/// Extensions for manipulating DataTables
|
|
/// </summary>
|
|
public static class DataTableExtensions
|
|
{
|
|
private static string suffixPattern = @"(_DNAME)|(_BNAME)|(_BOOL)";
|
|
|
|
/// <summary>
|
|
/// Replaces id columns with added _DNAME and _BNAME colums.
|
|
/// </summary>
|
|
/// <param name="table">DataTable returned by DataAccessBase.GetData.</param>
|
|
public static DataTable ConsolidateColumns(this DataTable table)
|
|
{
|
|
//Reading all column names
|
|
var columnNames = (table.Columns.Cast<DataColumn>().Select(column => column.ColumnName)).ToList();
|
|
|
|
//Selecting the columns we need in the right order
|
|
var orderedColumnNames = new List<string>();
|
|
foreach (var name in columnNames)
|
|
{
|
|
if (Regex.IsMatch(name, suffixPattern))
|
|
{
|
|
continue;
|
|
}
|
|
if (columnNames.Contains($"{name}_DNAME"))
|
|
{
|
|
orderedColumnNames.Add($"{name}_DNAME");
|
|
}
|
|
else if (columnNames.Contains($"{name}_BNAME"))
|
|
{
|
|
orderedColumnNames.Add($"{name}_BNAME");
|
|
}
|
|
else
|
|
{
|
|
orderedColumnNames.Add(name);
|
|
}
|
|
}
|
|
|
|
//Removing everything else
|
|
var redundantColumnNames = columnNames.Except(orderedColumnNames);
|
|
foreach (var name in redundantColumnNames)
|
|
{
|
|
table.Columns.Remove(name);
|
|
}
|
|
|
|
//Ordering columns
|
|
var i = 0;
|
|
foreach (var name in orderedColumnNames)
|
|
{
|
|
table.Columns[name].SetOrdinal(i++);
|
|
}
|
|
|
|
//Renaming columns
|
|
var suffixedColumnNames = orderedColumnNames.Where(n => Regex.IsMatch(n, suffixPattern));
|
|
foreach (var name in suffixedColumnNames)
|
|
{
|
|
table.Columns[name].ColumnName = Regex.Replace(name, suffixPattern, string.Empty);
|
|
}
|
|
|
|
return table;
|
|
}
|
|
}
|
|
}
|