0
votes

Vérifiez l'objet null à l'intérieur de l'ordre

J'ai une liste avec quelques enregistrements, list a un autre objet à l'intérieur. Basé sur l'objet intérieur, j'utilise eckbyDescendant . L'objet intérieur est null dans quelques endroits de sorte qu'il lance nullreferenceException . xxx

lorsque obj_announcement est > null la requête jette une exception.

ne pas dupliquer: j'ai un objet à l'intérieur OrderByDescendant non unique.

Comment puis-je résoudre ce problème numéro?


5 commentaires

Dupliqué possible de Linq Commande de Null Colonne où l'ordre est ascendant et NULLS devrait être Dernier


Pour résoudre ce problème, vous devez d'abord décider de la manière dont les valeurs null doivent être triées. Devraient-ils être les plus bas ou les plus élevés?


@ Renévogt - J'ai besoin de derniers enregistrements en haut, de cette façon dont j'ai besoin.


La bibliothèque nette n'autorise pas une null pour un objet DateTime. Habituellement, j'utilise une nouvelle dateTime qui définit la date par défaut à 1/1/1. Ensuite, je testez pour NULL en vérifiant si la date est supérieure à 1/1/1.


Vous devez commander HASVALUE d'un objet intérieur puis la liste de commandes par sa valeur: éléments.orderbydescendants (i => i.obj_announcaire.createddate.hasvalue) .Chendedescendants (i => i.obj_announcaire.createddate.value)


3 Réponses :


1
votes
items.OrderByDescending(i=> i.Obj_Announcement?.CreatedDate ?? DateTime.MinValue).ToList()
should work, as if the value is null, it will return DateTime.MinValue (meaning null values will be at the back), and otherwise, you will just retrieve the CreatedDate.Please note that I am not in front of a pc right now though, so could not test.

0 commentaires

2
votes

Vous avez essentiellement deux options en fonction de l'ensemble résultant que vous attendez.

  1. exclure les instances, ce qui est obj_announcement code> - la propriété est null. Mais je n'ai pas la portée de la question et changerait le Beavior du programme. P> Li>

  2. décider explicitement sur la façon de gérer les nulls. p> li> ol>

    Lorsque vous regardez la documentation de OrderByDescendant code> ( https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumérable.orderbydescendants ) On se passe sur le Keyselector code> paramètre. Puisqu'il s'agit d'un Func Code> Il devrait être en mesure de faire face aux cas de bord un Tsource code> peut montrer - par exemple NULLS sur un objet enfant, dans votre cas. Donc, IMHO La solution la plus simple sur la manière de traiter ce qui pourrait décider si vous souhaitez préparer ou ajouter les nulls à la liste par P>

    items.OrderByDescending(i=> i.Obj_Announcement?.CreatedDate ?? DateTime.MaxValue).ToList()
    


0 commentaires

3
votes

La méthode NEAT serait de séparer votre requête LINQ de la manière dont vous définissez le fonctionnement de l'élément avant un autre élément. Dans un autre mot: quel est l'ordre de tri de l'élément x et l'élément y

pour cela, nous devons créer une classe qui implémente icomparer code> p> xxx pré >

Supposons que vous avez deux articles code>, l'un d'eux a un anoncement NULL code>. p>

var result = items.OrderByDescending(item => item, ItemComparer.ByCreatedDate);


1 commentaires

+1, c'est une bonne réponse! Mais je pense qu'il n'y a pas de surcharge pour OrderbyDescendant (iEnumerable , Icomarer ) selon docs.microsoft.com/en-us/dotnet/api/... . IMHO, l'appel devrait donc ressembler à items.orderbydescendances (élément => élément, élémentcomparer.bycreateddate); et il convient de noter qu'il n'est probablement pas traduisable lorsqu'il n'est probablement pas traduisable lorsqu'il n'est probablement pas traduisable lorsqu'il n'est probablement pas traduisant lorsqu'il est utilisé avec IQueryable comme ou cartographie, ODATA ou autre.