2010-11-08 2 views
2

Voici un sauvage. J'écris un éditeur d'univers universel en utilisant JQuery et NHibernate LINQ. Jusqu'à présent, tout fonctionne bien. Mais maintenant j'essaie d'ajouter un support de tri. Les choses sont devenues difficiles. Je veux lui dire de trier sur une propriété, mais dans la classe, je ne saurai pas quel genre d'objet il est avant l'exécution.LINQ et la réflexion

Voici le code:

data = 
    (from entity in _repository.FindAll() 
    orderby entity.GetType().GetProperty(formData["sidx"]).GetValue(entity, null) 
    select entity).ToList(); 

Voilà le problème, je reçois une exception de pointeur nul quand je fais cela. Des indices sur comment je peux faire ce que je veux faire? Je soupçonne que cette question va revenir lorsque je ferai des recherches.

+2

Où est la référence null se produisent? (Stack trace.) – jordanbtucker

+0

Avez-vous essayé de l'écrire dans la syntaxe de code et de rompre chaque étape dans sa propre ligne pour trouver où l'exception de point nul se produit? –

+0

Nick, pouvez-vous expliquer votre suggestion un peu plus? Merci! –

Répondre

3

Utilisez Dynamic LINQ (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx), section Téléchargement de la bibliothèque de requêtes LINQ dynamique) et préciser le champ pour trier par comme une chaîne:

data = _repository.FindAll().OrderBy(formData["sidx"].ToString()).ToList(); 
+0

+1 c'est exactement ce que nous faisons dans un projet –

+0

Merci! On pourrait penser que cela serait intégré dans les bibliothèques standard. Mais ensuite, il serait abusé, je suppose. Vous avez une idée pourquoi la descente ne fonctionne pas avec Dynamic LINQ? –

+1

Essayez .OrderBy (formData ["sidx"]. ToString() + "desc"). ToList() pour l'ordre décroissant. Il est implémenté en tant que partie de l'expression dans l'appel .OrderBy au lieu d'étendre la méthode .OrderByDescending. – mellamokb

0

Cela devrait fonctionner à condition que formData["sidx"] spécifie le nom d'une propriété existante avec le cas approprié. Vérifiez ce que formData["sidx"] renvoie et si c'est dans le cas correct. Je commencerais par coder en dur un nom de propriété réel. Si cela fonctionne, vérifiez formData["sidx"]. Par exemple, si vous utilisez une classe avec la propriété Name, votre code affichera NullReferenceException si vous avez utilisé GetProperty("NaMe").