【发布时间】:2010-11-15 20:34:42
【问题描述】:
我在处理某个映射时遇到了问题。假设我有三个评估都来自基础Assessment:
public abstract class Assessment
{
public abstract int DamageCostTotal { get; set; }
}
public class IndividualAssessment
{
public virtual int DamageCostHouse { get; set; }
public virtual int DamageCostCar { get; set; }
public virtual int DamageCostBelongings { get; set; }
public override DamageCostTotal
{
get { return DamageCostHouse + DamageCostCar + DamageCostBelongings; }
}
}
public class BusinessAssessment
{
public virtual int DamageCostBuilding { get; set; }
public virtual int DamageCostGoods { get; set; }
public virtual int DamageCostOther { get; set; }
public override DamageCostTotal
{
get { return DamageCostBuilding + DamageCostGoods + DamageCostOther; }
}
}
public class InfrastructureAssessment
{
public virtual int DamageCostStructure { get; set; }
public virtual int DamageCostEstimatedRepair { get; set; }
public override DamageCostTotal
{
get { return DamageCostStructure + DamageCostEstimatedRepair; }
}
}
也就是说,IndividualAssessment、BusinessAssessment和InfrastructureAssessment这三种评估类型都有特定的伤害消耗,但它们都实现了基类'DamageTotalCost以获得一个评估的总伤害成本。
在我的 Fluent NHibernate 映射中,我为每个特定评估映射了每个 DamageCostTotal:
// individual assessment
Map(x => x.DamageCostTotal)
.Access.Readonly()
.Formula("DamageCostHouse + DamageCostCar + DamageCostBelongings");
// the other two are mapped the same way, just with a different formula
当我查询特定的评估类型时,这非常有用:
Session.Query<IndividualAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<BusinessAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<InfrastructureAssessment>().OrderBy(x => x.DamageCostTotal);
但是当我尝试查询基础评估类型时:
Session.Query<Assessment>().OrderBy(x => x.DamageCostTotal);
它生成了错误的 SQL(为了便于阅读,稍微清理了一下):
SELECT ...
DamageCostHouse + DamageCostCar + DamageCostBelongings as formula0_0_,
DamageCostBuilding + DamageCostGoods + DamageCostOther as formula1_0_,
DamageCostStructure + DamageCostEstimatedRepair as formula2_0_,
FROM [Assessment] this_
ORDER BY DamageCostStructure + DamageCostEstimatedRepair
如您所见,它正确地创建了公式,但是当它执行ORDER BY 时,它仅按InfrastructureAssessment 属性而不是公式对其进行排序。有谁知道如何映射基础DamageCostTotal 以便此查询返回正确的结果?
【问题讨论】:
标签: c# sql nhibernate fluent-nhibernate nhibernate-mapping