使用NHibernate,我需要能够配置我的应用程序,以根据需要对特定的实体集合进行排序。
可配置的排序:
此功能继承自现有应用程序,其中部分SQL由管理员指定,SQL语句是动态构建/执行的。
每当我尝试通过一个解决方案时,我就开始进入泥泞的水域,各种各样的警报在我的头脑中都会出现关于可维护性,性能,可扩展性,安全性等等。
例如,我认为管理员可以指定逗号分隔的字符串,如下所示:
“日期asc,FirstName asc,LastName desc”
我可以拆分字符串并通过一个匹配case语句中的属性/排序配对的循环,并根据需要调用.AddOrder(Order.Asc(“FirstName”))。但是,我该如何处理自定义属性?我可以允许用户指定用于计算自定义属性的SQL,然后允许用户对FirstName进行排序,但我似乎又回到了脏/ kludge。
是否有一种干净/适当的方式来处理这一要求?
答案 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语句。如果它们存在,我仍然愿意接受更好的建议。