0
votes

Tri de la date de chaîne d'une liste de nombreuses données différentes

J'ai une liste issue d'une base de données et souhaite trier la variable Datefcreation de cette liste. C'est le type de données est dans la chaîne.

Comment puis-je y aller?

Je suis allé faire ce qui a été instructé sur ce site ici

et révisé pour s'adapter à mon code, l'erreur est

Erreur CS0834 Une expression de Lambda avec un corps de déclaration ne peut pas être convertie en arborescence d'expression xxx

CollectionRecords vient de < PRE> XXX

Entrée d'échantillon:
  • Non daté
  • 1991 8 mai
  • Mars 2012
  • Divers DATES
  • 8 avril 2018

    Sortie attendue:
    • 8 avril 2018
    • Mars 2012
    • 1991 8 mai
    • Divers DATES
    • Non daté


10 commentaires

Quel est votre code complet? Juste la ligne avec l'expression de Lambda. Je ne vois rien de mal avec le code que vous avez posté ci-dessus. Au moins syntaxiquement parler.


@Tydress j'ai mis à jour la question, il n'a pas été montré à cause d'une erreur de faute de frappe


Comment 1991 8 mai viendra-t-il avant mars 2012? Je pense que vous devez mettre à jour votre production attendue


Duplicata de "A Lambda L'expression avec un corps de déclaration ne peut pas être convertie en un arbre d'expression "


Question mise à jour @venkataramanr


@defaultlocale J'ai essayé la méthode, mais cela ne semble pas fonctionner? varechardlist3 = CollectionRecords.ordorderbydescendances (x => {var y = x.datefreation; DateTime dt; si (! Datetime.tryparse (y, sorti dt)) Retournez DateTime.MAXValue; renvoyer dt;});


mars 2012 n'est pas une date valide dont il a besoin d'un numéro de jour, comment il devrait convertir comme une date? -Hth;).


"Diverses dates" et "non datée" n'est pas une date, c'est pourquoi la trypairse est appelée à essayer si elle peut être transformée en une date, sinon elle est mise en bas @ Sha.t


Mais par exemple, quand vous avez mars 2012 et 2012 mars 1 dans votre liste comment celles doivent être triées comme résultat attendu?


@Nikkimunoz s'il vous plaît, lisez l'explication en premier. Vous essayez toujours d'utiliser le bloc de code complexe au lieu d'une simple expression. Cela fonctionnera pour un Liste , mais ne fonctionnera pas pour ling-to- Collection SQL. Ce que vous pouvez faire est de Convertir CollectionRecords à Liste ( CollectionsRecords.tolist (). CommandeByDescendant (... ) puis triez-le, mais cela permettra de passer à des performances sous-optimales, car la liste va être triée sur le côté du client.


3 Réponses :


0
votes

Premièrement, vous ne devez pas utiliser de chaînes comme dates, c'est pourquoi vous devez cesser de les convertir en DateTime d'abord avant de commander. Si vous avez besoin de stocker une date, rangez-le comme une date et non comme une chaîne.

La valeur attendue est aussi mauvaise que cela semble. Si j'exécute votre code via Linqpad, j'ai une sortie correcte de 8 avril 2018 mars 2012 1991 8 mai Diverses dates non daté

mais cela nécessite datetime.minvalue pas de valeur maximale à renvoyer.

aussi je reçois la même sortie dans vs. Quel est le contexte de CollectionRecords? C'est peut-être iceérable? Je pense que si vous essayez de le convertir en une matrice ou iSenumerable avant de commander, cela devrait fonctionner comme un charme.

mis à jour: Comment le stockez-vous dans la base de données? comme une chaîne ou une date? Créez une migration dans la base de données et rangez-la comme une date, sauf si vous êtes spécifiquement tenu de stocker ceux comme des chaînes et de stocker de telles valeurs comme des "dates variées" ou "non datée", ce qui est un peu faux car vous enfreignez le concept de DateTime . Vous ne devez pas stocker autre chose dans un champ de base de données DateTime ou stocker des champs de type DateTime dans une chaîne / des colonnes de type VRCHAR. Il est préférable d'avoir deux colonnes distinctes dans la base de données, par exemple: colonne type DateTime qui stocke uniquement les dates et dispose d'une colonne de type booléenneenne comme "isuaté".

Bien sûr, tout dépend du logiciel que vous travaillez si vous pouvez faire ces changements, sinon, vous devez faire ce que vous faites déjà, assurez-vous simplement que les types que vous utilisez pour l'expression sont corrects, non pas intéressé, mais une liste ou un iéenérable.


2 commentaires

Comment devrais-je y aller? Ma liste contient non seulement la chaîne de date, mais également d'autres types de données.


@Nikkimunoz a mis à jour ma réponse.



0
votes

Vous pouvez implémenter Icomarable interface et méthode de remplacement comparèteo , pour décider de l'ordre de tri par défaut.


0 commentaires

0
votes

Vous devriez probablement écouter les autres personnes commentant la structure de la base de données, mais pour contourner l'erreur code> ERUT CODE> ERREUR, vous pouvez exécuter l'instruction sur la DB en premier par:

var orderedList3 = collectionRecords.ToList().OrderByDescending(x =>
{
      DateTime dt;
      if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
      return dt;
});


0 commentaires