2009-04-03 5 views
1

Je n'arrive pas à donner à un prédicat LINQ les connaissances dont il a besoin pour trier par ordre alphabétique ou numérique.Trier les données MultiValue numériquement ou par ordre alphabétique - LINQ to SQL et C# 3

Je travaille avec un ensemble de données pivotant à plusieurs valeurs avec une colonne triable. La colonne est toujours stockée en tant que varchar dans la base de données, cependant, elle a une connaissance de ce que ce type de données est en réalité. Pour simplifier, en plus des chaînes, la colonne peut contenir des entiers.

J'ai écrit un prédicat de tri général (et fonctionnel) comme suit.

Func<MyObject, string> sortClause = p => p.MyObjectProperties.Find(s => s.Name == theSortProperty).Value; 

Le problème est que si ma colonne triable contient des valeurs numériques (stockées sous forme varchar dans le DB), je reçois

13 
131 <-- 131 between 13 and 14!!! 
14 
15 

Bien sûr, cela est correct alphanumériquement.

Comme je l'ai dit, je connais par programme le type de données (chaîne ou entier) pour theSortProperty. Je veux être en mesure d'ordonner au prédicat de trier en utilisant des moyens alphabétiques OU des moyens numériques. Je ne vois pas de moyen facile d'accomplir cela, puisque mon mappage LINQ to SQL déclare cette colonne comme [Colonne (Stockage = "_ Valeur", DbType = "NVarChar (MAX)", UpdateCheck = UpdateCheck.Never)]

Je suis sûr que quelqu'un doit avoir vu cela avant et peut offrir une suggestion. Je devrais mentionner que NHibernate ou d'autres ORMs sont hors de question pour moi ..... Merci

+0

J'ai remplacé votre balise à valeurs multiples "cuite" par C# pour faciliter la réponse. –

Répondre

0

Une manière d'accomplir ceci est de bourrer vos valeurs numériques de chaîne avec des zéros, jusqu'à la longueur de la plus grande valeur qui peut se produisent, et trier sur la valeur matelassée:

string s = "131"; 
s = s.PadLeft(8, '0'); 
+0

J'ai pensé à quelque chose comme ça aussi, mais comment pourrais-je l'appliquer au prédicat de tri montré ci-dessus? Je devrais remplir le .Value pour le prédicat, et je ne peux pas comprendre comment cette syntaxe fonctionnerait. –

+0

OK, maintenant je comprends: Func sortClause = p => p.MyObjectProperties.Find (s => s.Name == theSortProperty) .Value.ToString(). PadLeft (8, '0 '); merci! –

0

Vous pouvez utiliser certaines des fonctions de System.Convert dans votre requête LINQ. Si vous passez votre commande à System.Convert.ToInt32(), vous devriez pouvoir trier numériquement plutôt que lexicographiquement.

Questions connexes