2 votes

LINQ utilisant Automapper pour une propriété de troisième niveau

J'ai trois objets du cadre d'entités qui sont imbriqués les uns dans les autres - voir l'image ci-dessous. J'ai également généré des objets similaires en tant que DTO pour les mettre en correspondance.

Ma question est donc la suivante : en tant que document d'entreprise possède une liste de ListCompanyDocumentsType Lorsque j'exécute une requête pour sélectionner toutes les entreprises, celle-ci renvoie une liste d'entreprises et de leurs documents, ainsi qu'une liste de types de documents avec une liste de tous les documents que chaque type possède dans la base de données (comme une boucle).

Existe-t-il un moyen de renvoyer le document de l'entreprise avec un seul type de document ? Ou est-ce que je l'ai mal conçu ? Pour résoudre ce problème, j'ai utilisé un objet mappé et un for each qui renvoie le nom du type dans une propriété DTO non mappée. Cela fonctionne donc, mais je ne suis pas sûr que ce soit la bonne méthode.

J'ai également essayé d'utiliser EF .include() pour aller jusqu'à ListCompanyDocumentTypes, mais il renvoie toujours tous les documents que chaque type possède.

        var config = new MapperConfiguration(cfg => { cfg.CreateMap<Company, CompanyDto>(); cfg.CreateMap<CompanyDocument,CompanyDocumentDto>();});
        var mapper = config.CreateMapper();

        var newDtoTest = mapper.Map<List<CompanyDto>>(companiesReturn);

        var db = new entities();
        foreach (var companyDto in newDtoTest)
        {
            foreach (var companyDtoCompanyDocument in companyDto.CompanyDocuments)
            {
                companyDtoCompanyDocument.dtoTypeName = (await db.ListCompanyDocumentsTypes.FirstOrDefaultAsync(p=> p.id.Equals(companyDtoCompanyDocument.typeId))).typeName; 
            }
        }

Entity Framework Objects

Nous vous remercions,

1voto

M. Wiśnicki Points 5033

Vous devez utiliser ForMember() En utilisant cette méthode, vous serez en mesure de définir la valeur appropriée pour le champ spécifique :

 cfg.CreateMap<Company, CompanyDto>()
        .ForMember(dest => dest.dtoTypeName, opt => opt.MapFrom(src => src.CompanyDocuments.ListCompanyDocumentsTypes.FirstOrDefault().typeName));

Et companiesReturn devrait être un IQueryable<Company> de sorte que votre méthode d'échantillonnage GetAll Company Les besoins comprennent CompanyDocuments y ListCompanyDocumentsTypes et devrait ressembler à ce qui suit :

public IQueryable<AttributeElement> GetAll()
 {
        return CompanyRepository.GetQueryable()
            .Include(d => d.CompanyDocuments)
            .ThenInclude(d => d.ListCompanyDocumentsTypes);
 }

Automapper a un mappage facile, vous n'avez pas besoin d'utiliser des boucles supplémentaires, tout peut être configuré dans la classe de configuration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X