Projection de données dans le Cadre de l'Entité et Automapper
Je veux utiliser AutoMapper à la construction d'un ViewModel (aplatissement - projection de données) pour une utilisation dans un ASP.net MVC app.
var tmp = from x in db.Mailings select Mapper.Map<Mailing, MailingViewModel>(x);
return View(tmp.ToList());
Bien sûr, quand j'ai essayer l'exemple ci-dessus, j'ai l'EF erreur "LINQ to entities ne reconnaît pas la méthode..., et cette méthode ne peut pas être traduit dans un magasin d'expression".
Je sais que c'est possible de déplacer l' .ToList() avant le Automapper ne sa magie, mais puis-je récupérer tous les champs de la bd (et je n'ai besoin que de 3 de 20 champs)
Est-il possible de l'utiliser de façon propre. Nettoyer = tous les champs sont extraites de la base de données, mais uniquement les champs nécessaires pour le ViewModel. Est-il possible dans Automapper? Ou peut-être une autre bibliothèque? (sans le faire manuellement 😉 )
- C'est assez "dangereux" pour utiliser AutoMapper dans les projections, parce que si vous avez un aplatissement de fonctionnement de la carte (
target.Prop1 = source.Ref1.Prop1
) vous pouvez créer un N+1 scénario.
Vous devez vous connecter pour publier un commentaire.
Oui c'est très possible. Voir ici http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-code
Edit: j'ai récemment constaté que la base de cela existe déjà dans AutoMapper. ajouter une instruction d'utilisation pour AutoMapper.QueryableExtensions et vous sont fournis avec un IQueryable extension appelée Projet<>()
Vous pouvez simplement appeler:
Vous n'avez pas besoin AutoMapper pour la simple projection si vous avez accès EF directement dans le contrôleur.
Vous ne pouvez pas associer AutoMapper dans linq-to-interroger des entités - pas moyen. Vous devez retourner entité (ou d'un autre objet projeté) et la carte en AutoMapper ou de l'utilisation de la plaine de projection sans AutoMapper.
Cela est causé par la façon linq interagit avec IQueryableProviders ( je pense que c'est l'interface ).
Donc ce qui se passe est que Linq est arriver compilé en une expression de l'arbre dont le sous-jacent linq fournisseur lit et tente de convertir à sql. Le linq fournisseur n'a aucune idée de comment traduire
Mapper.Map<>
en SQL par conséquent l'erreur.Pour une bonne vidéo sur la façon de linq travail des fournisseurs de départ: http://channel9.msdn.com/Shows/Going+Deep/Erik-Meijer-et-Bart-De-Smet-LINQ-to-Rien
Vous devriez être en mesure de le faire à l'aide de AutoMapper de DynamicMap. Je crois que quelque chose comme ce qui suit seuil de résoudre votre problème si vous voulez vraiment utiliser AutoMapper, bien que dans ce cas particulier, je suis d'accord avec Ladislav Mrnka.
Malheureusement, si vous souhaitez limiter le nombre de colonnes que vous êtes de retour à partir de la base de données, vous devez spécifier que vous voulez, ce qui ne l'encontre du but de AutoMapper dans ce scénario. Ce serait vraiment bien AutoMapper extension si, de prendre le type de destination et de créer dynamiquement une expression de sélection basé sur le type de propriétés.
Cela peut être fait en utilisant LINQ Projecteur de la bibliothèque. Il est basé sur http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-code et ajoute quelques cartographie des conventions.
depuis Automapper ne fonctionne pas directement à la base de données (besoin de se transformer en un objet de mémoire avant d'aborder la question), j'ai écrit propre classe simple pour copier des propriétés identiques:
Code Initial:
MyMapper: