J'ai des problèmes avec un certain mapping. Disons que j'ai trois évaluations que tous dérivent de base Assessment
:Comment mapper une propriété dérivée sur une classe de base à l'aide de NHibernate?
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; }
}
}
En d'autres termes, les trois types d'évaluation, IndividualAssessment
, BusinessAssessment
et InfrastructureAssessment
, ont tous les coûts des dommages spécifiques, mais toutes mettent en œuvre la classe de base 'DamageTotalCost
afin d'obtenir le coût total des dommages d'une évaluation.
Dans mes applications Fluent NHibernate, je cartographié chaque DamageCostTotal pour chaque évaluation spécifique:
// 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
Cela fonctionne très bien quand je fais une recherche sur les types spécifiques d'évaluation:
Session.Query<IndividualAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<BusinessAssessment>().OrderBy(x => x.DamageCostTotal);
Session.Query<InfrastructureAssessment>().OrderBy(x => x.DamageCostTotal);
Mais lorsque je tente de interroger sur le type d'évaluation de base:
Session.Query<Assessment>().OrderBy(x => x.DamageCostTotal);
Il génère le mal SQL (nettoyé un peu pour faciliter la lecture):
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
Comme vous pouvez le voir, cela crée correctement les formules, mais quand il fait le ORDER BY
, il ne l'ordonne par les InfrastructureAssessment
propriétés et non les formules. Est-ce que quelqu'un sait comment mapper la base DamageCostTotal
afin que cette requête renvoie le résultat correct?
Merci, je l'ai essayé et il fonctionne très bien. –