C# 使用Nhibernate按';它没有映射

C# 使用Nhibernate按';它没有映射,c#,nhibernate,orm,projection,C#,Nhibernate,Orm,Projection,我有以下课程: 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); } } } publi

我有以下课程:

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);
}
公共类员工
{
公共虚拟整数Id{get;set;}
公共虚拟十进制工资{get;set;}
公共虚拟十进制税{get;set;}
公共虚拟十进制NetSalary{get{return Salary*(1-Tax);}
}
公共类EmployeeMap:ClassMap
{
WithTable(“员工”);
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
var-criteria=DetachedCriteria.For();
criteria=criteria.AddOrder(Order.Asc(sortProperty));//sortProperty是一个字符串

现在,如果我想按
Salary
排序,那么这个方法很有效,但是我想按
NetSalary
排序。我将如何实现这一点?我无法更改数据库。我发现有一个重载
Order.Asc()
,它接受一个投影。我确信我必须在该条件中创建一个投影,并将其输入其中,但我没有找到有关如何执行该操作的信息。

虽然不是最干净的方法,但您可以为计算属性定义投影,如下所示:

var netSalaryProjection = Projections.SqlProjection("Salary * (1 - Tax) as NetSalary", new[] { "NetSalary" }, new IType[] { NHibernateUtil.Decimal});
并将其用于排序:

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

请注意,这可能适用于SQL Server,也可能适用于其他提供程序。

您是否考虑过存储计算值?这将需要将计算逻辑移动到setter,并添加一列用于存储。由于计算是在写入期间执行的,因此在对读取数据进行排序时,它的性能会更好。这也将使按查询排序变得简单。希望这有帮助