NHibernate - 真正的动态排序

时间:2011-05-09 22:00:51

标签: nhibernate sql-order-by

使用NHibernate,我需要能够配置我的应用程序,以根据需要对特定的实体集合进行排序。

可配置的排序:

  • 可能涉及多个属性
  • 可以按任何顺序指定排序的属性
  • 可以在已排序的属性
  • 上指定asc / desc
  • 可以按自定义属性排序(即没有相应的SQL / C#属性 - 计算它)

此功能继承自现有应用程序,其中部分SQL由管理员指定,SQL语句是动态构建/执行的。

每当我尝试通过一个解决方案时,我就开始进入泥泞的水域,各种各样的警报在我的头脑中都会出现关于可维护性,性能,可扩展性,安全性等等。

例如,我认为管理员可以指定逗号分隔的字符串,如下所示:

“日期asc,FirstName asc,LastName desc”

我可以拆分字符串并通过一个匹配case语句中的属性/排序配对的循环,并根据需要调用.AddOrder(Order.Asc(“FirstName”))。但是,我该如何处理自定义属性?我可以允许用户指定用于计算自定义属性的SQL,然后允许用户对FirstName进行排序,但我似乎又回到了脏/ kludge。

是否有一种干净/适当的方式来处理这一要求?

1 个答案:

答案 0 :(得分:2)

经过深思熟虑和好运,我可能有一个解决方案。

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))

我仍然无法按自定义属性排序,但也许我可以在order by子句中应用case语句。如果它们存在,我仍然愿意接受更好的建议。