gpt4 book ai didi

c# - LINQ 将 Automapper 用于第三级属性

转载 作者:搜寻专家 更新时间:2023-10-30 20:35:26 24 4
gpt4 key购买 nike

我有三个嵌套的 Entity Framework 对象 - 请参见下图。此外,我生成了与 DTO 类似的对象来映射它们。

所以我的问题是,由于 companyDocument 对象有一个 ListCompanyDocumentsType 列表,当我执行查询以选择所有公司时,它会返回一个公司列表及其文档加上文档类型列表,其中包含每种类型在数据库中具有的所有文档的列表(如循环)。

有什么方法可以只返回一种文档类型的 companyDocument 吗?还是我设计的不对?为了解决这个问题,我使用了一个映射对象和一个在非映射 DTO 属性中返回类型名称的对象。所以它正在工作,但我不确定这是否是正确的方法。

此外,我尝试使用 EF .include() 来访问 ListCompanyDocumentTypes,但它仍然返回每种类型具有的所有文档。

        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

谢谢,

最佳答案

你应该使用 ForMember() ,使用此方法,您将能够为特定字段设置适当的值:

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

companiesReturn应该是 IQueryable<Company>类型,所以你的示例方法 GetAll Company需要包括 CompanyDocumentsListCompanyDocumentsTypes应该看起来像:

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

Automapper 映射简单,不需要额外的循环,一切都可以在配置类中设置。

关于c# - LINQ 将 Automapper 用于第三级属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41828983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com