2010-08-05 11 views
1

J'ai une requête d'hibernation qui retourne une liste d'objets et que je veux commander par un titre. C'est un domaine géré par l'utilisateur et certains de nos clients aiment préfixer leurs titres avec des chiffres, ce n'est pas quelque chose que je peux contrôler. Les données sont quelque chose comme ceci:Natural Trier dans NHibernate

- 1 first thing 
- 2 second thing 
- 5 fifth thing 
- 10 tenth thing 
- 20 twentieth thing 
- A thing with no number 

Une traditionnelle

.AddOrder(Order.Asc("Name")) 

se traduit par une sorte de texte:

- 1 first thing 
- 10 tenth thing 
- 2 second thing 
- 20 twentieth thing 
- 5 fifth thing 
- A thing with no number 

Ceci est correct car cela est un champ nvarchar, mais est-il chemin que je peux obtenir les numéros à trier aussi bien?

Il semble y avoir plusieurs solutions de contournement impliquant le préfixage de tous les champs avec les 0 principaux et similaires, mais est-ce que l'une d'entre elles fonctionne avec NHibernate?

Cette application s'exécute de manière interchangeable sur Oracle et MsSQL.

Vive,

Matt

Répondre

0

Vous pourriez envisager de créer une implémentation custom sort order qui vous permet de spécifier le classement sur la colonne pour obtenir les résultats souhaités. Quelque chose le long des lignes de:

ORDER BY Name COLLATE Latin1_General_BIN ASC 

Mais avec un classement approprié (je ne crois pas Latin1_General_BIN est ce que vous avez besoin spécifiquement)

+0

J'ai fait quelque chose de similaire mais en C#, le seul cas c'est un problème quand j'ai une liste exhaustive des éléments que je souhaite montrer à l'utilisateur, donc je récupère les objets (en utilisant une projection name) puis appliquez un ordre LINQ avec un comparateur personnalisé pour trier les nombres. –

+0

Juste essayé de vous voter comme cette réponse semble correcte, mais je n'ai pas assez de rep. Je l'ai marqué comme la réponse à la place. –

0

Ajouter champ supplémentaire (par exemple le nom Name_Number) à l'objet et defenition requête sur le côté serveur.

Pour Oracle, sélectionnez dans ce champ to_number(Name) as Name_Number. Pour Pour MS SQL, sélectionnez .

trier ensuite sur le côté client comme .AddOrder(Order.Asc("Name_Number"))

post-scriptum Je ne suis pas sûr, parce que n'ont pas assez d'expérience avec mise en veille prolongée/NHibernate et la haine ORM du tout :)

+0

Malheureusement, cela ne fonctionne pas comme le numéro est le champ n'est pas réellement un morceau de données séparé, son texte supplémentaire que certains utilisateurs ajoutent pour donner la priorité à l'élément pour le faire apparaître plus tôt dans la commande. –