2015-01-06 35 views
0

我有這些類:使用NHibernate的通過不是映射計算屬性進行排序

public class Employee 
{ 
    public virtual int Id { get; set; } 
    public virtual decimal Salary { get; set; } 
    public virtual decimal Tax { get; set; } 
    public virtual decimal NetSalary { get { return Salary * (1 - Tax); } } 
} 


public class EmployeeMap : ClassMap<Employee> 
{ 
    WithTable("Employees"); 
    Id(x => x.Id); 
    Map(x => x.Salary); 
    Map(x => x.Tax); 
} 

而且我檢索員工形成這樣的數據庫:

var criteria = DetachedCriteria.For<Employee>(); 
criteria = criteria.AddOrder(Order.Asc(sortProperty)); // sortProperty is a string 

現在這個效果很好如果我想按Salary排序,但我想按NetSalary排序。我將如何實現這一目標?我無法更改數據庫。我發現有一個Order.Asc()的超載需要投影。我相信我必須在那個標準中創建一個投影,然後在那裏提供它,但是我沒有找到有關如何去做的信息。

回答

0

雖然不是最乾淨的方法,您可以定義投影爲您的計算性能,就像這樣:

var netSalaryProjection = Projections.SqlProjection("Salary * (1 - Tax) as NetSalary", new[] { "NetSalary" }, new IType[] { NHibernateUtil.Decimal}); 

並使用它來排序:

criteria.AddOrder(Order.Asc(netSalaryProjection)); 

注意,這將有可能與合作SQL Server和其他可能的提供者。

0

您是否考慮過存儲計算值?這將需要將計算邏輯移至設置器並添加一列用於存儲。由於在寫入期間執行計算,所以在讀取數據時訂購數據時性能會更好。這也會使查詢的順序變得簡單。希望這可以幫助。

相關問題