J'essaye de trier une liste de produits par leur prix.
L'ensemble de résultats doit répertorier les produits par prix de bas en haut par colonne LowestPrice
. Cependant, cette colonne peut être Nullable.
Je peux trier la liste par ordre décroissant comme ceci:
var products = from p in _context.Products
where p.ProductTypeId == 1
orderby p.LowestPrice.HasValue descending
orderby p.LowestPrice descending
select p;
// returns: 102, 101, 100, null, null
Cependant, je ne peux pas comprendre comment trier cela par ordre croissant.
// i'd like: 100, 101, 102, null, null
orderby p.LowestPrice ?? Int.MaxValue;
est un moyen simple.OrderByDescending, ThenBy
c'est plus clair.orderby
, et je me suis retrouvé à la recherche de côté :)Réponses:
Essayez de mettre les deux colonnes dans le même ordre
Sinon, chaque commande est une opération distincte sur la collection qui la réorganise à chaque fois.
Cela devrait ordonner ceux avec une valeur en premier, "puis" l'ordre de la valeur.
la source
orderby p.LowestPrice == null, p.LowestPrice ascending
Hope aide quelqu'un.Cela aide vraiment à comprendre la syntaxe de requête LINQ et comment elle est traduite en appels de méthode LINQ.
Il se trouve que
sera traduit par le compilateur en
Ce n'est absolument pas ce que vous voulez. Ce genre de
Product.LowestPrice.HasValue
dans l'descending
ordre et puis re-trie toute la collection parProduct.LowestPrice
dans l'descending
ordre.Ce que tu veux c'est
que vous pouvez obtenir en utilisant la syntaxe de requête en
Pour plus de détails sur les traductions de la syntaxe de requête aux appels de méthode, consultez la spécification du langage. Sérieusement. Lis le.
la source
La solution pour les valeurs de chaîne est vraiment bizarre:
La seule raison qui fonctionne est que la première expression
OrderBy()
,, trie lesbool
valeurs:true
/false
.false
result aller d'abord suivi dutrue
résultat (nullables) etThenBy()
trier les valeurs non nulles par ordre alphabétique.Donc, je préfère faire quelque chose de plus lisible comme celui-ci:
Si
SomeString
est nul, il sera remplacé par"z"
, puis triera tout par ordre alphabétique.REMARQUE: ce n'est pas une solution ultime car
"z"
passe en premier par les valeurs z commezebra
.MISE À JOUR 9/6/2016 - À propos du commentaire @jornhd, c'est vraiment une bonne solution, mais cela reste un peu complexe, je recommanderai donc de l'envelopper dans une classe d'extension, comme celle-ci:
Et utilisez-le simplement comme:
la source
J'ai une autre option dans cette situation. Ma liste est objList, et je dois commander mais les valeurs nulles doivent être à la fin. ma décision:
la source
J'essayais de trouver une solution LINQ à cela mais je n'ai pas pu la résoudre à partir des réponses ici.
Ma réponse finale a été:
la source
ma décision:
la source
C'est ce que j'ai trouvé parce que j'utilise des méthodes d'extension et que mon élément est une chaîne, donc non
.HasValue
:Cela fonctionne avec les objets LINQ 2 en mémoire. Je ne l'ai pas testé avec EF ou tout autre ORM DB.
la source
Vous trouverez ci-dessous une méthode d'extension pour vérifier la valeur null si vous souhaitez trier sur la propriété enfant d'un keySelector.
Et utilisez-le simplement comme:
la source
Voici une autre façon:
SUP_APPROVED_IND is char(1) in Oracle db.
Notez qu'il
r.SUP_APPROVED_IND.Trim() == null
est traité commetrim(SUP_APPROVED_IND) is null
dans Oracle db.Voir ceci pour plus de détails: Comment puis-je rechercher des valeurs nulles dans le cadre d'entité?
la source
Une autre option (était pratique pour notre scénario):
Nous avons une table utilisateur, stockant
ADName, LastName, FirstName
Nous avons modifié le schéma de la table et ajouté une colonne "SortIndex", qui définit certains groupes de tri. (Nous avons laissé un espace de 5, donc nous pouvons insérer des groupes plus tard)
Maintenant, au niveau des requêtes, ce serait:
dans les expressions de méthode:
ce qui donne le résultat attendu:
la source