Je voudrais implémenter MVC en utilisant LINQ (spécifiquement, LINQ-to-entities). La façon dont je ferais ceci est que le contrôleur génère (ou appelle quelque chose qui génère) le jeu de résultats en utilisant LINQ, puis le renvoie à la vue pour afficher les données. Le problème est, si je fais:Un moyen simple de renvoyer des types anonymes (pour rendre MVC possible avec LINQ)
return (from o in myTable select o);
Toutes les les colonnes sont lues à partir de la base de données, même celles (potentiellement des dizaines) je ne veux pas. Et - plus important encore - je ne peux pas faire quelque chose comme ceci:
return (from o in myTable select new { o.column });
parce qu'il n'y a aucun moyen de faire le type de sécurité de types anonymes! Je sais avec certitude qu'il n'y a pas de manière agréable et propre de faire cela en 3.5 (this n'est pas propre ...), mais qu'en est-il de la version 4.0? Y a-t-il quelque chose de prévu, ou même de proposé? Sans quelque chose comme duck-typing-for-LINQ, ou des valeurs de retour anonymes sécurisées (il me semble que le compilateur devrait certainement en être capable), il semble presque impossible de séparer proprement le Controller de la View.
Lorsque vous travaillez avec un orm, vous devez vous habituer à ce que sql sélectionne toutes les colonnes d'une table. Si vous écrivez des requêtes qui n'en sélectionne que quelques-unes, vous pourriez tout aussi bien utiliser sql en premier lieu. Si vous avez des dizaines de propriétés sur vos objets, c'est votre problème. Vos objets devraient être plus petits et vous devriez réfléchir à comment vous pouvez résoudre ce problème. Les types anonymes ne doivent pas être transmis, spécialement pas comme des modèles à une vue. –
@Mattias: Malheureusement, la vie n'est pas si simple. Par exemple, considérons le cas où je sélectionne quelques colonnes de différentes tables, y compris un tableau d'objets sélectionnés à l'aide d'une requête interne LINQ. Autant que je sache, il n'y a aucun moyen de retourner cela comme un seul objet EF - il doit * être * un nouveau type, et définir un nouveau type concret pour chaque requête comme celle-ci est ridiculement lourd. –
On dirait que vous avez un très mauvais modèle. Votre objet doit avoir les références dont il a besoin et vous pouvez simplement utiliser la méthode "Include()" dans EF (pour charger avec impatience ces données). Si vous arrêtez de penser aux données sous forme de colonnes différentes dans des tableaux différents, et plus sur votre modèle (plus d'OO), il sera probablement plus facile de travailler avec. Bottom line: Si vous ressentez le besoin de passer des types anonymes, vous êtes probablement en train de faire quelque chose d'autre. –