2011-05-09 76 views
1

使用NHibernate,我需要能夠配置我的應用程序,以根據需要對特定的實體集合進行排序。NHibernate - 真正的動態排序

可配置的排序:

  • 可能涉及多個屬性
  • 可以按任意順序指定
  • 可以在分類性能
  • 可以通過自定義屬性進行排序指定遞增/遞減排序特性(即沒有相應的SQL/C#屬性 - 它被計算)

此功能是從現有的應用程序繼承而來的,其中部分SQL由管理員指定,並且SQL語句是動態構建/執行的。

每次我試圖通過一個解決方案,我開始變得與各種警報在我的腦海都會響起關於可維護性,性能,擴展性,安全性等泥水思考..

例如,我的數字管理員可以像這樣指定一個逗號分隔的字符串:

「日期遞增,名字遞增,姓氏DESC」

我可以分割字符串,並經過一個循環,一個case語句相匹配的屬性/分類配對,並呼籲.AddOrder(Order.Asc(「FirstName」))。但是,如何處理自定義屬性?我可以允許用戶指定用於計算自定義屬性的SQL,然後允許用戶按照他們的名字排序,但我似乎又回到了髒/ kludge。

有沒有一種乾淨/適當的方式來處理這個要求?

回答

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

我還是不能排序的自定義屬性,但也許我可以逃脫應用案例按順序排列的語句。如果它們存在,我仍然樂於提供更好的建議。

+0

您實際上只是將用戶輸入視爲SQL。但是你可以解析(例如自定義屬性),在你的CustomOrder類中從頭開始驗證和構建SQL。在我看來,這是一個非常好的開始。 – 2011-05-10 13:39:09