NHibernate - действительно динамическая сортировка - PullRequest
1 голос
/ 10 мая 2011

Используя NHibernate, я должен иметь возможность настроить свое приложение для точной сортировки определенного набора объектов.

Настраиваемый вид:

  • может включать несколько свойств
  • можно указать отсортированные свойства в любом порядке
  • можно указать asc / desc для отсортированных свойств
  • может сортировать по пользовательским свойствам (т. Е. Нет соответствующего свойства SQL / C # - оно вычисляется)

Эта функциональность унаследована от существующего приложения, в котором части SQL задаются администратором, а оператор SQL создается / выполняется динамически.

Каждый раз, когда я пытаюсь обдумать решение, я начинаю погружаться в мутную воду со всевозможными сигналами тревоги в отношении удобства обслуживания, производительности, масштабируемости, безопасности и т. Д.

Например, я считаю, что администратор может указать строку с разделителями-запятыми, например, так:

"Date asc, FirstName asc, LastName desc"

Я могу разбить строку и пройти цикл, соответствующий парам свойство / сортировка в операторе case, и при необходимости вызвать .AddOrder (Order.Asc ("FirstName")). Но как мне обрабатывать пользовательские свойства? Я мог бы позволить пользователю указать SQL для вычисления пользовательских свойств, а затем разрешить пользователю сортировать по тем же параметрам, что и FirstName, но, похоже, я снова вернулся к dirty / kludge.

Есть ли чистый / подходящий способ справиться с этим требованием?

1 Ответ

2 голосов
/ 10 мая 2011

После долгих раздумий и удачи у меня может быть решение.

public class CustomOrder : Order
{
  private string customOrderSql;

  public CustomOrder(string customOrderSql) : base("", true)
  {
    this.customOrderSql = customOrderSql;
  }

public override NHibernate.SqlCommand.SqlString ToSqlString(
    ICriteria criteria, ICriteriaQuery criteriaQuery) 
  { 
    return new NHibernate.SqlCommand.SqlString(this.customOrderSql); 
  }

}

Я могу передать произвольную строку сортировки в мой репозиторий, где я добавлю свой CustomOrder следующим образом:

.AddOrder(new CustomOrder(customSort))

Я до сих пор не могу отсортировать по пользовательским свойствам, но, возможно, я смогу избежать применения операторов case в предложении order by.Я все еще открыт для лучших предложений, если они существуют.

...