2010-04-06 6 views
3

Je passe du contrôleur un tableau généré par le code suivant:Problème avec commande par LINQ dans

public ActionResult GetClasses(bool ajax, string kingdom) 
     { 
      int _kingdom = _taxon.getKingdom(kingdom); 

      var query = (from c in vwAnimalsTaxon.All() 
         orderby c.ClaName 
         select new { taxRecID = c.ClaRecID, taxName = c.ClaName }).Distinct(); 

      return Json(query, JsonRequestBehavior.AllowGet); 
     } 

La liste des requêtes doit être ordonnée, mais cela ne fonctionne pas, je reçois les noms de les classes ont été mal classées dans le tableau, parce que j'ai vu le débogage que les noms ne sont pas commandés. La vue est juste une liste déroulante chargée automatiquement, donc je suis presque sûr que le problème est avec l'action. Est-ce que tu vois quelque chose qui ne va pas?

Répondre

10

Je pense que gmcalab est presque là. La raison pour laquelle ça ne marche pas, c'est que Distinct balaie la commande. Donc, vous avez besoin de distincte ALORS OrderBy. Mais cela signifie que vous devez trier le nouveau nom d'attribut:

var query = (from c in vwAnimalsTaxon.All() 
    select new { taxRecID = c.ClaRecID, taxName = c.ClaName } 
).Distinct().OrderBy(t => t.taxName); 
+0

Oui, ça y est, je ne savais pas que ça pouvait arriver comme ça, même si je soupçonné quelque chose, mais je ne savais pas comment faire la commande en tant que méthode ... Merci – vikitor

2

pour cette solution:

var query = (from c in vwAnimalsTaxon.All() 
      select new { taxRecID = c.ClaRecID, taxName = c.ClaName } 
).Distinct().OrdeyBy(c => c.ClaName); 
+0

merci, ça marche, même si c => t.taxName au lieu de c.ClaName dans la méthode orderBy: D – vikitor

1

En LINQ la méthode Distinct ne fait aucune garantie sur l'ordre des résultats. Dans de nombreux cas, Distinct entraîne l'optimisation de la méthode OrderBy. Il est donc nécessaire de faire l'OrderBy en dernier, après le Distinct.

var query = (from c in vwAnimalsTaxon.All() 
      select new { taxRecID = c.ClaRecID, taxName = c.ClaName }) 
      .Distinct() 
      .OrderBy(c => c.ClaName); 
0

La sélection va également souffler le tri. Donc, soit Distinct ou Select doit être commandé par après.