2010-07-29 4 views
4

J'utilise NHibernate comme ORM et j'essaie de trier certaines données. Les données doivent être récupérées paginées.Tri NHibernate (SQL comme deuxième option)

Deux des colonnes de ma table Request sont UrgencyID et CreateDate. UrgencyID est un FK de la table d'urgence avec des données statiques: 1 = faible, 2 = normal, 3 = élevé, 4 = critique.

Je dois commander mes demandes de la manière suivante. Demandes critiques par CreateDate descendant Toutes les autres demandes par CreateDate descendant

donc ma liste de demandes doivent toujours critique par CreateDate desc en haut, puis toutes les autres demandes (sans tenir compte UrgencyID) par CreateDate desc

Est-il possible d'effectuer cet ordre de tri dans NHibernate (en utilisant l'API Criteria)?

Sinon, comment le ferais-je en SQL? Dans une procédure stockée?

EDIT: Solution à la fois grâce @DanP et Pakhantsov @ Michael

en utilisant le préfixe this_ dans la chaîne SQL comme cela est le préfixe par défaut NHibernate pour la sélection de table primaire.

public class OperatorJobQueueOrder : Order 
    { 
     public OperatorJobQueueOrder() : base("", true) { } 
     public override NHibernate.SqlCommand.SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) 
     { 
      return new NHibernate.SqlCommand.SqlString("case this_.JobRequestUrgencyID when 4 then 4 else 0 end desc, this_.CreatedDate"); 
     } 
    } 

Répondre

1
IN SQL ORDER BY will be 

    ORDER by case UrgencyId when 4 then 4 else 0 end, CreateDate desc 
+0

Merci pour votre aide Les deux réponses ici m'a aidé à atteindre le résultat - en utilisant le sql fourni avec le tri personnalisé NHibernate. Est-il possible de récompenser les gens en répondant partiellement à une question? –

+0

@Ciaran: Michael a répondu en premier, vous devriez accepter sa réponse. Si vous avez utilisé une combinaison de nos réponses; pourquoi ne pas modifier votre message pour inclure la solution complète? – DanP

2

Vous pourriez être en mesure de créer un ordre de tri personnalisé pour gérer cela par l'api critiera; Voir this question pour un exemple de mise en œuvre.

+0

Merci pour votre aide –