0
votes

Commande par plusieurs propriétés avec Linq à SQL

J'ai la liste que je veux commander par comme ceci xxx

ordre par RefunStatus Tout d'abord, puis:

si si Refundestatus == 1 puis par Sumbittime ascendance,

si refundstatus! = 1 par Sumppittime .

Comment dois-je faire par Linq à SQL?

mise à jour: J'ai fait des modifications suivies suivi de Michal Turczyn .Mais d'affichage de la sortie du journal n'a pas pu être traduit par

Microsoft.Entyframeworkcore.Query: AVERTISSEMENT: L'expression LINQ 'Orderby [p] .refundstatus ASC, ([P] .SumbitTime.ticks * Convertir (iif (([p] .refundstatus == 1), 1, -1), INT64)) ASC, Ef.property (? [P] ?, "ID") ASC 'ne pouvait pas être traduit et sera évalué localement. Microsoft.entityframeworkcore.Query: AVERTISSEMENT: le LINQ Expression 'Order By [P] .refundstatus ASC, ([P] .SumbitTime.ticks * Convertir (iif (([p] .refundstatus == 1), 1, -1), INT64)) ASC, Ef.property (? [P] ?, "ID") ASC 'ne pouvait pas être traduit et sera évalué localement.


3 commentaires

@ VC74 Désolé, je ne comprends pas ce que signifie votre statut. Tous les remboursements de la collection ont différents refundstatus


@Z. Chen Votre question n'est pas cristalline pour moi, un exemple avec des échantillons de données aiderait ...


@ Z.chen Pourriez-vous fournir un exemple d'entrée / sortie?


3 Réponses :


0
votes

Cela devrait faire ce que vous recherchez si je comprends votre question correctement.

var sorted = refundList.GroupBy(refund => refund.RefundStatus)
    .SelectMany(
        group => group.Key == 1 
        ? group.OrderBy(p => p.SumbitTime)
        : group.OrderByDescending(p => p.SumbitTime))
    .ToList();


1 commentaires

Je suis désolé, cela ne fonctionne pas .Turrez un type d'argument d'exception ne correspond pas à



1
votes

Je ferais cela en suivant: xxx

L'idée est que lorsque vous multipliez par -1 nombre de ticks dans votre DateTime , il l'ordonnera en ordre décroissant sans avoir à diviser votre collection à deux parties.


7 commentaires

C'est une bonne idée mais je ne suis pas sûr que ticks peut être traduit en SQL.


@ VC74 Ceci est géré par .NET et linq2sql framework en interne. Donc, vous ne devriez pas m'inquiéter à ce sujet :)


Toutes les requêtes LINQ ne peuvent pas être traduites en SQL, en particulier celles utilisant des fonctionnalités .NET. Mais cela peut marcher, attendons que l'op d'essayer ...


C'est une bonne idée, mais cela ne fonctionne pas. Pour une référence d'objet d'exception non définie sur une instance d'objet. A à Lambda_Method (fermeture, anonymousobject) sur system.linq.internal.lookup 2.Createforjoinasync (iayncenumer capable 1 source, func 2 Keyselector, iéqualitycomparer 1 comparateur, annulation d'annulation ) Dans d: \ a \ 1 \ 1 \ s \ ix.net \ source \ system.interactive.async \ lookup.cs: li ne 301


@ Z.chen check NullReferenceException


@ Michałturczyn je mets skip / prendre après l'ordre de l'ordre, puis de. il fonctionne avec succès. Merci ~


@ Michałturczyn J'ai suivi Linq aux journaux SQL. @ VC 74 peut être correct. Logs Sortie dans ma mise à jour



0
votes

Vous pouvez utiliser ce qui suit.

Refund = 0 - SubmitTime = 22-03-2019 14:31:16
Refund = 0 - SubmitTime = 22-03-2019 14:29:16
Refund = 0 - SubmitTime = 22-03-2019 14:28:16
Refund = 0 - SubmitTime = 22-03-2019 14:26:16
Refund = 0 - SubmitTime = 22-03-2019 14:23:16
Refund = 1 - SubmitTime = 22-03-2019 14:22:16
Refund = 1 - SubmitTime = 22-03-2019 14:24:16
Refund = 1 - SubmitTime = 22-03-2019 14:25:16
Refund = 1 - SubmitTime = 22-03-2019 14:27:16
Refund = 1 - SubmitTime = 22-03-2019 14:30:16


1 commentaires

Cela a fonctionné sur Linq, mais il ne peut pas être traduit en SQL