2010-03-15 4 views
3

Je me demande comment résoudre au mieux ce problème, car ce que j'ai maintenant fonctionne très bien pour une colonne codée en dur selon moi - je me demande comment je peux l'étendre pour permettre à la colonne d'être dynamique.Groupe LINQ dynamique par requête dans ASP.NET MVC

CONTRÔLEUR:

var dc = new DataContextDC(); 
return View(dc.items.Where(i=>i.IsPublic == true)); 

VIEW:

<% foreach (var grp in Model.GroupBy(s => s.GroupColumn)) { %> 
    <%= Html.Encode(grp.Key) %> 
    <% foreach (var item in grp) { %> 
     <%= Html.Encode(item.Title) %> 
    <% } %> 
<% } %> 

Comme indiqué, l'objectif est de permettre à l'utilisateur de choisir la colonne qui remplace "GroupColumn" ci-dessus. Je voudrais éviter d'ajouter des bibliothèques externes, etc.

Je vois en utilisant la réflexion (lent, mais entièrement dynamique) ou comme c'est une vue dans mon application, je viens de dupliquer le code ci-dessus pour chaque colonne dans la base de données puis mettre une instruction switch sur elle (rapide et sale, mais efficace)

Répondre

4

Ceci est probablement le genre de chose que vous allez vouloir pour utiliser la bibliothèque Linq Dynamic Query incluse avec les échantillons C# Linq. De cette façon, vous pouvez écrire la requête comme ceci:

var groups = Model.GroupBy("SomeColumn, SomeOtherColumn") 

... ce qui est beaucoup plus facile à gérer si vous acceptez les noms de colonnes de l'utilisateur - très probablement tout ce que vous avez sont les noms de colonnes comme chaînes, et cette bibliothèque les analysera automatiquement en expressions lambda pour vous. (Vous devez attraper ParseException si vous attendez la possibilité d'entrée non valide).

Pour le formatage de la clé, vous pouvez probablement le passer directement à la méthode Html.Encode, sa représentation par défaut étant quelque chose comme { ID = 1, Name = Test }. Si cela suffit, alors je le laisserais seul, sinon vous devrez utiliser Reflection pour analyser les propriétés clés individuelles et les valeurs des propriétés. Editer: Vous pouvez utiliser cette bibliothèque n'importe où, si vous téléchargez les échantillons, vous verrez que c'est juste un fichier de code source.

+0

Quelle serait la meilleure pratique? Dois-je compiler le fichier .CS séparément? ou devrais-je simplement l'inclure dans mon propre projet? – Nate

+1

@Nate Bross: Il n'y a pas de meilleure pratique spécifique; Si vous prévoyez la possibilité de réutiliser la fonctionnalité dans une application différente, compilez-la en tant que bibliothèque séparée (il existe déjà un fichier '.sln'), sinon l'une ou l'autre façon fonctionne. C'est MSPL donc vous pouvez faire tout ce que vous voulez avec; la seule chose que vous ne pouvez pas faire est de redistribuer le fichier source lui-même sans la ligne de copyright en haut. – Aaronaught

+0

OK, appelez-moi stupide, mais je ne peux pas obtenir ce code pour fonctionner dans la vue, cela fonctionne dans mon contrôleur, mais je ne peux pas comprendre comment ajouter 'using System.Linq.Dynamic' à la vue et' < % @ Import ...%> 'ne fonctionne pas, y a-t-il quelque chose qui me manque? – Nate

1
+0

Cette production de bibliothèque est-elle prête? Est-il gratuit à utiliser dans des applications à source fermée? – Nate

+1

Les bibliothèques IMHO ne sont pas prêtes pour la production jusqu'à ce que vous écriviez des tests pour couvrir vos scénarios d'utilisation. – jfar

+0

@jfar Est-ce que vous écrivez vraiment des tests pour vérifier que System.String fonctionne avant d'utiliser des objets String en production? – Nate