2017-02-17 3 views
0

Ich brauche eine Projektion von Datenbank zu Modell Entität. Bevor Daten in der Datenbank erhalten und mit Einheit von Wort zu Entity Karte und reposy:Projektion mit Automapper

public async Task<IEnumerable<Entity>> GetProjectsSponsorByYear(Guid idUser) 
    { 
     logger.Trace("Called GetProjectsSponsorByYear method in ProjectBusiness"); 
     var Entitys = await this.unitOfWork.Repository<Entity>().Queryable().Where(p => p.SponsorId == idUser && p.Draft == true).ToListAsync(); 


return listProjectDataBaseAsModel; 

, danach Verwendung AutoMapper für eine Karte zwischen Entity erstellen und Modell:

this.CreateMap<Entity, Model>() 
      .ForMember(dest => dest.ID, opt => opt.MapFrom(src => src.ID)) 
      .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title)) 


public async Task<IEnumerable<Model>> GetProjectHistoricList() 
    { 
     logger.Trace("Called GetProjectHistoricList method in ProjectService"); 

     var allProjects = await this.projectBusiness.GetAll(); 

     var allProjectsGrid = this.entityMapper.Map<IEnumerable<Entity>, IEnumerable<Model>>(allProjects); 

     return allProjectsGrid; 
    } 

aber jetzt brauche ich gemacht ein Projektion von Datenbank-Modell Einheit, ist das Problem bei der Verwendung createMap, für die Konfiguration AutoMapper, ich habe Eigenschaft mit der Methode

.ForMember(dest => dest.ImpactSupervisorDescription, opt => opt.MapFrom(src => src.ImpactSupervisor.GetDescription())) 

wenn die Projektion zwischen Repository gemacht und Modell mit ProjectTo-Methode eine Get Execution von Linq. Ich weiß, dass diese Ausführung für Linq eine Abfrage erstellen und diese Methode nicht in ihr implementieren soll.

Sie müssen wissen, ob es einen Weg gibt, dies zu erreichen, entweder vor oder nach der Projektion.

Antwort

0

Sehen Sie sich das AutoMapper.EF6-Projekt an. Es verwendet ein anderes Projekt, DelegateDecompiler, um Projektionen basierend auf dem Methoden- und Eigenschaftsinhalt zu erstellen. Er untersucht die IL und baut einen Ausdruck, daß IL passen dann zu Ihrem abfragbaren Anbieter weitergeben müssen:

https://www.nuget.org/packages/AutoMapper.EF6/

Dann können Sie direkt aus dem abfragbaren Projekt zur Liste:

var allProjectsGrid = await this.projectBusiness.GetAll() 
           .ProjectToListAsync<Model>(); 

als auch als Randnotiz, Sie brauchen nicht diese ForMember Anrufe für ID und Titel, das ist der Auto-Teil von AutoMapper :)

+0

Vielen Dank für anwer :), Wenn ich die Projektion in getAll() Methode, zum Beispiel dies tun wollte Weg: "Repository () .Queryable(). ProjectTo (). ToListAsync() "; kann ich ProjectToListAsync Methode ??? –

+0

Ja, du kannst! Es tut die ProjectTo und ToList, aber fügt auch, dass Delegate Decompiler Schritt in der Mitte: https://losechies.com/jimmybogard/2015/07/08/entity-framework-extensions-for-automapper/ –