我有这些课程:
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 :(得分:0)
虽然不是最干净的方法,但您可以为计算属性定义投影,如下所示:
var netSalaryProjection = Projections.SqlProjection("Salary * (1 - Tax) as NetSalary", new[] { "NetSalary" }, new IType[] { NHibernateUtil.Decimal});
并将其用于分类:
criteria.AddOrder(Order.Asc(netSalaryProjection));
请注意,这可能适用于SQL Server以及可能的其他提供程序。
答案 1 :(得分:0)
您是否考虑过存储计算值?这将需要将计算逻辑移动到设置器并添加一列用于存储。由于在写入期间执行计算,因此在对读取数据进行排序时它将表现得更好。这也将使查询的顺序变得简单。希望这可以帮助。