Orderby() ne pas ordonner correctement les numéros de c#
Je suis en train d'écrire une application pour mon entreprise et je suis actuellement en train de travailler sur la fonctionnalité de recherche. Lorsqu'un utilisateur recherche un élément, je veux afficher la version la plus récente (qui est stockée dans une base de données).
Le problème est, la version est stockée comme une chaîne de caractères au lieu de int, et quand je fais un OrderBy(q=>q.La Version) sur les résultats, ils sont retournés comme
1
10
11
2
3
...
Évidemment 2 vient avant 10.
Est-il un moyen pour moi de lancer la version comme un entier ou est-il un simple IComparer là-bas? Je ne pouvais pas trouver quoi que ce soit jusqu'à présent.
J'ai essayé de faire ceci:
var items = (from r in results
select r).OrderBy(q => Int32.Parse(q.Version));
Cette compile mais ne fonctionne pas.
- J'aurais suggéré exactement ce que vous avez fait à la fin de votre question (commande par
q => int.Parse(q.Version)
); qu'entendez-vous par "ne fonctionne pas"? - Peut-être que votre problème est ici:
(q => Int32.Parse(q.Version))
. Doit-il seulement être(q => Int32.Parse(q))
en conformité avec les versions de travail ci-dessous? - Je reçois ce message d'erreur: "la Méthode" Int32 Parse(System.String)' n'a pas pris en charge la traduction de" SQL " lors de la visualisation des résultats énumérés
- Darcy est de filtrer une collection de quelque objet avec un
Version
bien;int.Parse
de ne pas travailler pour cela. - Je ne peux pas le faire parce que la Version est la partie de l'objet de la table. Ce n'est pas seulement une simple chaîne de caractères.
- Ah, vous êtes donc à l'aide de LINQ to SQL... toutes les réponses sont ci-dessous fournit des méthodes pour appeler
OrderBy
sur de simples collections (p. ex., tableaux). - Vous cherchez un naturel trieur/de la commande par
Vous devez vous connecter pour publier un commentaire.
Int32.Analyser n'est pas pris en charge par le LinqToSql traducteur. Convertir des.ToInt32 est pris en charge.
http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx
http://msdn.microsoft.com/en-us/library/bb882655.aspx
Votre problème est ailleurs, les ouvrages suivants:
Si votre problème est de LINQ to SQL, puis ce qui se passe est CLR est d'essayer de créer SQL de votre LINQ et de ne pas comprendre
int.Parse
. Ce que vous pouvez faire est d'abord d'obtenir les données à partir de SQL puis commande une fois toutes les données sont chargées:Devrait le faire.
Si vous n'êtes pas en mesure de changer votre définition de la table (donc la version est un type numérique), et que votre requête est vraiment comme inscrit (votre utilisez pas sauter ou prendre, ou d'autres moyens de réduire le nombre de résultats), le meilleur que vous pouvez faire est d'appeler la "ToList" sur les ménagères de résultats, lorsque vous appliquez ensuite une OrderBY lambda, il aura lieu dans votre code, plutôt que d'essayer de le faire au niveau du Serveur SQL à la fin (et qui devrait maintenant fonctionner).
AsEnumerable
au lieu deToList
qui modifie le fournisseur de requêtes de retour à linq-to-objets, mais conserve le report de la sémantique d'exécution de requêtes linq au lieu de forcer l'exécution.Pourquoi êtes-vous le tri dans un lambda? Pourquoi ne pas simplement de tri dans la requête?
Maintenant que nous savons que vous êtes à l'aide de LINQ to SQL, vous pourriez envisager de faire un SQL standard d'appel sur ce point en faisant quelque chose comme:
Ou même
Qui va saigner dans votre LINQ comme un int (et si vous utilisez la deuxième itération, être ordonnée). Ça évite d'avoir à passer par le jeu de résultats deux fois dans LINQ (une fois pour l'interrogation, une fois pour la commande).
Il y a un impressionnant morceau de code qui fait un excellent travail quand il s'agit de tri naturel. Son nom est
AlphanumComparator
.Exemple de code:
Noter que la liste doit être dans la mémoire.
Si vous obtenez la version C#, faites ceci:
et
.ToList()
de sorte que leAlphanumComparator
ne peut faire son travail. 🙂J'ai fait un test. J'ai le code suivant.
Comme prévu, le résultat est 1, 10, 12, 2, 22, 30
Ensuite, vous permet d'en modifier
versions.OrderBy(v => v))
àversions.OrderBy(v => int.Parse(v)))
. Et il fonctionne très bien: 1, 2, 10, 12, 22, 30Je pense que votre problème est que vous avez alphabétique et non numérique caractères dans votre chaîne de caractères comme '.'. Quel type d'exception que vous obtenez?
essayez ceci:
que vais travailler dans Linq2Sql
Pourquoi êtes-vous de tri si vous avez seulement besoin "la version la plus récente"? Il sonne comme vous pourriez vous éviter une surcharge, si vous avez utilisé (Max).
Aussi, vous devriez vraiment changer la colonne de type integer.
Max
est parce que j'ai besoin de la version la plus récente de chaque élément. Un élément pourrait être quelque chose comme "name_423_1", où 1 est le numéro de version. Il pourrait y avoir "name_423_2" et "differentName_234_1"Certainement exécuter......
Il semble que vous avez une valeur de texte au lieu d'une valeur numérique.
Si vous avez besoin de trier, vous pouvez essayer: