3 votes

Utilisation de critères NHibernate pour additionner plusieurs propriétés/colonnes

Quelqu'un sait-il comment exprimer l'instruction SQL suivante en utilisant les critères de NHibernate ?

SELECT SUM(Val1 + Val2) FROM SomeTable

Cela semble simple, mais je n'ai pas trouvé de moyen de le faire sans renvoyer un tableau de valeurs, les sommes de Val1 + Val2 séparément, puis faire la somme à partir du tableau, ce que je veux éviter.

7voto

Michał Powaga Points 8949

Dans les commentaires de l'article du blog que @Jaguar a mentionné dans sa réponse NHibernate et la disparition de OperatorProjection est une solution alternative :

session.CreateCriteria().SetProjection(
    Projections.Property<SomeType>(val => val.Id),
    Projections.Property<SomeType>(val => val.Duration),
    Projections.SqlFunction(
        new VarArgsSQLFunction("(", "+", ")"),
        NHibernateUtil.Double,
        Projections.Property<SomeType>(val => val.Duration),
        Projections.Constant(1)
    )
).List();

Tout le mérite revient à Tomek .

Cela pourrait ressembler à quelque chose comme :

Projections.Sum(
    Projections.SqlFunction(
        new VarArgsSQLFunction("(", "+", ")"),
        NHibernateUtil.Int32,
        Projections.Property<SomeTableType>(val => val.Val1),
        Projections.Property<SomeTableType>(val => val.Val2)
    )
)

En particulier VarArgsSQLFunction est utile.

5voto

Jaguar Points 4765

Eh bien, après avoir lu pour la n-ième fois une question avec ce problème exact, j'ai décidé d'écrire une implémentation qui n'inclut pas l'écriture de SQL.

Vous pouvez vérifier la mise en œuvre à l'adresse suivante http://savale.blogspot.com/2011/04/nhibernate-and-missing.html avec lequel vous pouvez écrire :

criteria.SetProjection(
                 new ArithmeticOperatorProjection("+",
                                 NHibernateUtil.Int32,
                                 Projections.Property("Prop1"), Projections.Property("Prop2")
                                                  )
                );

1voto

Petr Kozelek Points 756

Je suppose que Val1 et Val2 sont des valeurs de propriété de vos entités. Dans ce cas, vous pouvez écrire votre propre NHibernate.Criterion.ICriterion personnalisé. Dans votre cas, vous implémenterez simplement les méthodes ToSqlString.

0voto

Baz1nga Points 10252

Ou vous pouvez utiliser HQL pour réaliser la même chose. il vous permet d'opérer sur vos objets .net et interroge ensuite le serveur en conséquence

vous pouvez construire votre requête comme suit

var hqlQuery= string.format(" select a.prop1 + a.prop2 from ClassA as a where a.Id={0}",val);

return session.CreateQuery(hqlQuery).UniqueResult<double>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X