Pochi giorni fa avevo scritto un post su come creare degli oggetti che incapsulassero le informazioni per filtrare dei dati in NH (e non solo).
Questo post non è altro che una piccolissima aggiunta con l'implementazione di una classe che rappresenta l'ordine dei risultati della query.
Il concetto è quello di avere una classe che contenga il campo da ordinare e la direzione di ordinamento (espressa tramite un enum).
public class OrderField
{
private string _field = string.Empty;
private OrderDirection _direction = OrderDirection.Asc;
public string Field
{
get { return _field; }
set { _field = value; }
}
public OrderDirection Direction
{
get { return _direction; }
set { _direction = value; }
}
public OrderField(string field, OrderDirection direction)
{
_field = field;
_direction = direction;
}
}
public enum OrderDirection
{
Asc,
Desc
}
Visto che potrebbero verificarsi numerosi casi in cui un solo campo non basta ai fini dell'ordinamento, ho pensato fosse utile implementare una collezione che dasse la possibilità di recuperare in un colpo tutta la stringa di ordinamento.
public class OrderFieldList: List<OrderField>
{
public override string ToString()
{
StringBuilder sb = new StringBuilder("");
if (this.Count >= 0)
{
sb.Append("ORDER BY ");
foreach (OrderField of in this)
{
sb.AppendFormat("{0} {1},", of.Field, of.Direction.ToString());
}
sb.Remove(sb.Length-1, 1);
}
return sb.ToString();
}
}
...e per finire la sua implementazione ai fini pratici è:
string hql = "select c from Customer c where c.Country = :country"
OrderFieldList ofl = new OrderFieldList();
ofl.Add(new OrderField("BirthDate", OrderDirection.Desc));
ofl.Add(new OrderField("LastName", OrderDirection.Asc));
hql += ofl.ToString();
//..........
//..........
//..........
....a presto!!!