I've made a couple of changes to the code to follow along with the naming of the methods used in the FilterBuilder. I've also refactored a few things to prevent a DRY problem.
SqlUtil.cst
#region SqlSortDirection Enum
/// <summary>
/// Enumeration of SQL expression Sort Directions
/// </summary>
public enum SqlSortDirection
{
/// <summary>
/// Database Ascending
/// </summary>
ASC,
/// <summary>
/// Database Descending
/// </summary>
DESC
}
#endregion
SqlStringBuilder.cst
#region SqlOrderByBuilder
/// <summary>
/// Allows for building SQL OrderBy expressions using strongly-typed column enumeration values.
/// </summary>
/// <typeparam name="EntityColumn">An enumeration of entity column names.</typeparam>
[CLSCompliant(true)]
public class SqlSortBuilder<EntityColumn> : SqlStringBuilder
{
/// <summary>
/// holds key value pair of ScheduledFlight column and sort direction
/// </summary>
private Dictionary<EntityColumn, SqlSortDirection> _columns = new Dictionary<EntityColumn, SqlSortDirection>();
#region Constructors
/// <summary>
/// Initializes a new instance of the SqlFilterBuilder class.
/// </summary>
public SqlSortBuilder() : base() { }
#endregion
#region Append
/// <summary>
/// Appends the specified column and sorts it by the specified SqlSortDirection
/// </summary>
/// <param name="column">The column to sort</param>
/// <param name="sortDirection">The specified column's sort direction</param>
/// <returns></returns>
public virtual void Append(EntityColumn column, SqlSortDirection sortDirection)
{
AddColumn(column, sortDirection);
}
/// <summary>
/// Appends the specified column and sorts it Ascending
/// </summary>
/// <param name="column">The column to sort</param>
/// <returns></returns>
public virtual void AppendASC(EntityColumn column)
{
AddColumn(column, SqlSortDirection.ASC);
}
/// <summary>
/// Appends the specified column and sorts it Descending
/// </summary>
/// <param name="column">The column to sort</param>
/// <returns></returns>
public virtual void AppendDESC(EntityColumn column)
{
AddColumn(column, SqlSortDirection.DESC);
}
#endregion
/// <summary>
/// Adds a column to the sort builder
/// </summary>
/// <param name="column">The entity's column to sort by</param>
/// <param name="sortDirection">The sort direction</param>
private void AddColumn(EntityColumn column, SqlSortDirection sortDirection)
{
_columns.Add(column, sortDirection);
}
/// <summary>
/// Provides the actual SQL sort string.
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder sb = new StringBuilder();
Int32 count = 1;
foreach (KeyValuePair<EntityColumn, SqlSortDirection> kvp in _columns)
{
sb.Append(kvp.Key).Append(" ").Append(kvp.Value);
if (count++ < _columns.Count)
{
sb.Append(", ");
}
}
return sb.ToString();
}
#region Methods
/// <summary>
/// Gets the column name from the specified column enumeration value.
/// </summary>
/// <param name="column"></param>
/// <returns></returns>
protected virtual String GetColumnName(EntityColumn column)
{
String name = EntityHelper.GetEnumTextValue(column as Enum);
if (String.IsNullOrEmpty(name))
{
name = column.ToString();
}
return name;
}
#endregion Methods
}
#endregion
EntityViewProviderBaseCore.generated.cst
#region <%= className %>SortBuilder
/// <summary>
/// A strongly-typed instance of the <see cref="SqlSortBuilder<EntityColumn>"/> class
/// that is used exclusively with a <see cref="<%= className %>"/> object.
/// </summary>
[CLSCompliant(true)]
public class <%= className %>SortBuilder : SqlSortBuilder<<%= className %>Column>
{
#region Constructors
/// <summary>
/// Initializes a new instance of the <%= className %>SqlSortBuilder class.
/// </summary>
public <%= className %>SortBuilder() : base() { }
#endregion Constructors
}
#endregion <%= className %>SortBuilder
EntityProviderBaseCore.generated.cst:
#region <%= entityClassName %>SortBuilder
/// <summary>
/// A strongly-typed instance of the <see cref="SqlSortBuilder<<%= GetClassName(SourceTable, ClassNameFormat.Column) %>>"/> class
/// that is used exclusively with a <see cref="<%= entityClassName %>"/> object.
/// </summary>
[CLSCompliant(true)]
public class <%= entityClassName %>SortBuilder : SqlSortBuilder<<%= GetClassName(SourceTable, ClassNameFormat.Column) %>>
{
#region Constructors
/// <summary>
/// Initializes a new instance of the <%= entityClassName %>SqlSortBuilder class.
/// </summary>
public <%= entityClassName %>SortBuilder() : base() { }
#endregion Constructors
}
#endregion <%= entityClassName %>SortBuilder
Next up is actually using it.... to be continued...
I'm outside ur box, shiftin' ur paradigm.