Comme nous le savons tous, la plupart des applications ont une couche d'accès aux données, utilisant souvent des classes de référentiel. Typiquement, nous voulons que le référentiel fonctionne avec fortement typé objets, par ex. Toutefois, nous souhaitons parfois créer une requête plus complexe sur une base de données, impliquant le regroupement et l'agrégation. Par exemple, nous voulons récupérer une valeur totale de tous les ordres de tous les utilisateurs (le jeu de résultats n'aura que deux colonnes: UserName et TotalAmount). Maintenant, ma question: à quoi ressemblerait la méthode du dépôt? Il y a des douzaines d'exemples sur internet de LINQ aux entités comment faire une requête avec sum et group by, mais tous ces exemples retournent des types anonymes. Alors, comment notre référentiel peut-il renvoyer le résultat d'une telle requête? L'autre réponse commune est: enveloppez-le dans une classe. Ainsi, la méthode pourrait ressembler à ceci:LINQ aux entités - bonnes pratiques pour passer des modèles
interface IUserRepository
{
UserOrderTotal[] GetOrderTotalsForAllUsers();
}
UserOrderTotal devrait être une petite classe avec les deux propriétés renvoyées par la requête: nom d'utilisateur et TotalAmount. Cette classe serait définie quelque part dans un de nos fichiers .cs. Est-ce vraiment la seule solution? Cela semble très mauvais parce qu'il introduit un nouveau modèle «temporaire» quelque part en dehors du modèle des entités principales (edmx). Idéalement, je voudrais d'enrichir mon modèle utilisateur avec un nouveau champ, appelé TotalAmount, qui ne serait renseigné dans cette requête, donc l'interface pourrait ressembler à ceci:
interface IUserRepository
{
User[] GetOrderTotalsForAllUsers();
}
Et ce serait de retourner des entités de l'utilisateur avec tous champs définis par défaut, à l'exception du nom et TotalAmount. Le problème que j'ai est que je ne peux pas compiler un modèle avec champ qui n'est pas mappé à une colonne de base de données. J'obtiens erreur Erreur 3004: Problème dans les fragments de mappage à partir de la ligne 2226: Aucun mappage spécifié pour les propriétés User.TotalAmount dans Set User.An Entité avec clé (PK) ne va pas aller-retour lorsque: Entité est de type [FPSoMeterModel.User ]
Est-ce que je le fais mal? Ce problème est-il trivial, ou peut-être que je pose de mauvaises questions? Faire une classe wrapper pour chaque requête (!) Qui implique l'agrégation semble un peu ridicule. Il semble que tout le contenu de LINQ encourage les gens à ne PAS utiliser une architecture multi-tiers, mais à construire des requêtes dans la même couche où les données sont rendues ... Comment les gars vous occupez-vous de cela, utilisez-vous des classes "repository" avec LINQ, si oui - comment renvoyez-vous des résultats de requête complexes?