Daten-Projektion in Entity Framework und Automapper
Will ich mit AutoMapper zu konstruieren, die ein ViewModel (Abflachung - Daten-Projektion) für die Verwendung in einer ASP.net MVC-app.
var tmp = from x in db.Mailings select Mapper.Map<Mailing, MailingViewModel>(x);
return View(tmp.ToList());
Natürlich, wenn ich versuche das Beispiel oben, bekomme ich das EF-Fehler "LINQ to Entities erkennt nicht die Methode ... Methode, und diese Methode kann nicht übersetzt werden, in einen laden zu Ausdruck."
Ich weiß, es ist möglich zu verschieben .ToList() vor dem Automapper macht seiner Magie, aber dann Hole ich meine alle Felder aus der Db (und ich brauche nur 3 der 20 Felder)
Ist es möglich, Sie in eine saubere Art und Weise. Sauber = Nicht alle Felder abgerufen werden von der DB, sondern nur die notwendigen Felder für das ViewModel. Ist es möglich in der Automapper? Oder vielleicht eine andere Bibliothek? (ohne es manuell zu tun 😉 )
- Es ist ziemlich "gefährlich" zu verwenden AutoMapper in Projektionen, weil, wenn Sie haben eine Abflachung operation in der Karte (
target.Prop1 = source.Ref1.Prop1
), könnten Sie eine N+1-Szenario.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist sehr gut möglich. Hier sehen http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-code
Edit: ich habe vor kurzem festgestellt, dass die Grundlage zu dieser existiert bereits in AutoMapper. fügen Sie eine using-Anweisung für den AutoMapper.QueryableExtensions und Sie sind mit ein IQueryable-Erweiterung namens Project<>()
Rufen Sie einfach an:
Brauchen Sie nicht AutoMapper für einfache Projektion, wenn Sie auf EF direkt im controller.
Können Sie nicht mit AutoMapper in linq-to-entities-Abfrage - no way. Sie müssen entweder zurück, die das Unternehmen (oder ein anderes Objekt projiziert) und Karte von AutoMapper oder mit normal-Projektion ohne AutoMapper.
Dies ist verursacht durch die Art und Weise linq interagiert mit IQueryableProviders ( ich denke, das ist die Oberfläche ).
Also, was geschieht ist, dass Linq wird immer kompiliert, um einen Ausdruck-Baum, der die zugrunde liegenden linq-Anbieter liest und versucht, Sie zu konvertieren, um sql. Der linq-Anbieter hat keine Ahnung, wie das zu übersetzen
Mapper.Map<>
in SQL-daher der Fehler.Für ein gutes video, wie man linq-Anbieter arbeiten, check-out: http://channel9.msdn.com/Shows/Going+Deep/Erik-Meijer-und-Bart-De-Smet-LINQ-zu-Nichts
Sollten Sie in der Lage, dies zu tun mit AutoMapper ist DynamicMap. Ich glaube, so etwas wie die folgenden Schweller lösen Ihr Problem, wenn Sie wirklich wollen, um zu verwenden, AutoMapper, obwohl in diesem speziellen Fall Stimme ich mit Mrnka Ladislav.
Leider, wenn Sie wollen, begrenzen Sie die Spalten, die Sie zurückgeben, aus der Datenbank, die Sie angeben müssen, welche Sie wollen, die nicht die Niederlage der Zweck der AutoMapper in diesem Szenario. Das wäre eine wirklich nette AutoMapper Erweiterung obwohl, nehmen das Ziel und erstellt dynamisch einen select-Ausdruck, basierend auf den Typ der Eigenschaften.
Diese kann getan werden, mit LINQ-Projektor Bibliothek. Es basiert auf http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-code und fügt einige mapping-Konventionen.
seit Automapper nicht direkt in einer Datenbank (transformieren müssen, um in-memory-Objekt vor der Behandlung), die ich geschrieben habe, eigene einfache Klasse zu kopieren identischen Eigenschaften:
Anfänglichen code:
MyMapper: