Question

Je réécrit une application qui doit dupliquer la logique d'alphabétisation d'un ancien système de mainframe. Dans l'ancien système centralframe, les identifiants d'enregistrement d'élément changent d'élément sont alphabétisés à partir d'une via Z, puis démarrent ensuite avec AA, AB, etc. Malheureusement, SQL Server et .NET veulent mettre des AA entre A et B, donc je dois sauter à travers des cerceaux. J'essaie d'abord de trier les identifiants de changement en descendant de la longueur et ensuite en alphabétisant dans l'ordre décroissant.

Voici la méthode que j'utilise pour récupérer les données:

protected internal IList<TeamViewModel> GetTeams(string recordId, string changeId)
{
    var viewModels = (from x in repository.Teams
               where x.RecordId == recordId && x.ChangeId.Length <= changeId.Length && 
                 (x.ChangeId.CompareTo(changeId) == -1 || x.ChangeId.CompareTo(changeId) == 0)
               orderby x.ChangeId.Length descending, x.ChangeId descending, x.ChangeId descending
               group x by x.TeamId into grp
               select grp.FirstOrDefault())
               .ToList()
               .Select(TeamViewModel.FromEntity)
               .ToList();

            return viewModels;
}

Chaque "enregistrement" a une collection d'enregistrements de changement et chaque modification enregistre une propriété Changeid et et Teatid qui a fait le changement. J'essaie d'obtenir le «nouveau» (selon l'ancienne logique de tri du mainfre) pour chaque équipe distincte. En d'autres termes, je tente de commander les archives, de les grouper par équipe, puis de saisir le premier enregistrement de chaque groupe.

Le référentiel.Teams La propriété renvoie un IQuiserable qui enveloppe l'objet déclaré dans mon objetContext.

Qu'est-ce qui souffle vraiment mon esprit est que cette requête fonctionne bien lorsque je l'exécute dans Linqpad (avec configuration par défaut) et cette méthode même exécute à l'intérieur des tests de l'unité lorsque j'ai injecté une maquette de mon référentiel dans cette classe, que j'ai configuré pour émettre les mêmes données exactes dans la base de données SQL.

Mais lorsque cette méthode est exécutée au moment de l'exécution, elle se comporte comme si la ligne avec la commande est complètement omise et me donne en fait les mêmes résultats que je ge Tin Linqpad (avec configuration par défaut) lorsque je commente la ligne avec le orderbys. SQL Profiler montre que le SQL généré est proche impossible à déchiffrer par un humain, mais qui ne contient pas le mot "ordre" dedans nulle part.

En tant que note finale, lorsque je configure Linqpad pour utiliser mon jeu de données typé généré par EF au sein de mon projet de mon projet, je reçois les mêmes résultats que je vois au moment de l'exécution, avec des résultats apparaissant comme si la commande de commande est ignorée.

J'aimerais pouvoir montrer des résultats réels, mais les données sont propriétaires, alors considérez simplement que les résultats corrects, tels que fournis par Linqpad et mes tests de l'unité, contiennent des enregistrements de modification avec des identifiants tels que "y" et "z" où comme l'inexplicable (pour moi) les résultats que je vois dans mon projet à l'exécution sont comme "A" et "B".

Quelqu'un peut-il voir ce qui se passe ici, et aussi surtout, ce que je dois changer pour faire cette fonction comme je m'attends?

Mon projet utilise l'entité Framework 5.0 et j'utilise LINQPAD 4.42.01.

Merci beaucoup!

Était-ce utile?

La solution

groupe par ne garantit pas de conserver l'ordre d'origine.Si vous voulez commander, vous devez commander après le groupe par.

En fait, il n'a même pas de sens à commander avant un groupe, car le groupe par est garanti de modifier l'ordre (sauf s'il n'y a qu'un seul groupe).

Autres conseils

Je vais faire une supposition sauvage ...

Vos changements ont toutes la même longueur.La base de données a-t-elle mappée comme une colonne Char (10) ou quelque chose à la place d'un Varchar, donc A est vraiment "A" et AB est vraiment "AB".Les ordinateurs centraux et les fichiers cobol et plats avec des compensations vous viennent à l'esprit comme ma justification.Si tel est le cas, vous devriez couper () le changement d'abord avant d'avoir la longueur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top