首页 > 解决方案 > 如何从列表中选择并使用 Automapper 映射另一个对象

问题描述

从嵌套的实体列表中,我们想要选择一个对象并将其映射到 Dto 对象中,但是当我们使用 Automapper 过滤 deleteDate 相等的对象null并映射它时,对于每一列 Automapper 再次在 db 上过滤。如何过滤一次并将选择的映射到 Dto 对象

我们需要将所有信息存储在我们的数据库中,因此请使用具有默认值的 DeleteDate 列null。所以我们使用一对多的关系来存储我们数据的历史。

public class User
{
    public Guid UserId { get; set; }

    public string MobileNumber { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public IList<CustomerDetail> CustomerDetails { get; set; }
}




public class CustomerDetail
{
    public Guid CustomerDetailId { get; set; }

    public float MaximumAmountPerTransaction { get; set; }

    public float MaximumAmountPerDay { get; set; }

    public bool IsConfirm { get; set; }

    public Guid UserId { get; set; }

    public virtual DateTimeOffset CreateDate { get; set; }

    public virtual DateTimeOffset? DeleteDate { get; set; }
}




public class CustomerResponse
{
    [Key]
    public Guid CustomerId{ get; set; }

    public string MobileNumber{ get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public bool IsConfirm { get; set; }

    public float? MaximumAmountPerTransaction { get; set; }

    public float? MaximumAmountPerDay { get; set; }
}



public class CustomerDomainProfile : Profile
{
    public UserDomainProfile()
    {
        CreateMap<User, CustomerResponse>()
            .ForMember(dest => dest.CustomerId,
                opt => opt.MapFrom(src => src.UserId))
            .ForMember(dest => dest.Country,
                opt => opt.MapFrom(src => src.Country.CommonName))
            .ForMember(dest => dest.IsConfirm,
                opt => opt.MapFrom(src =>      src.CustomerDetails.FirstOrDefault(cd => cd.DeleteDate ==  null).IsConfirm))
            .ForMember(dest => dest.MaximumAmountPerTransaction,
                opt => opt.MapFrom(src => src.CustomerDetails.FirstOrDefault(cd => cd.DeleteDate == null).MaximumAmountPerTransaction))
            .ForMember(dest => dest.MaximumAmountPerDay,
                opt => opt.MapFrom(src => src.CustomerDetails.FirstOrDefault(cd => cd.DeleteDate == null).MaximumAmountPerDay))
    }
}

我希望对数据库进行查询并选择带有 DeleteDate 的 CustomerDetails 为 null 并将其映射,但是我们定义的类型,对于尝试查询数据库的每一列,因为

我希望查询数据库并使用 DeleteDate 选择 CustomerDetailsnull和它的映射,但是我们的定义,对于每一列,都试图查询数据库,因为它无法识别它们来自同一个表。我们如何识别从一行中掉下来的它们以减少查询?还有其他解决方案或想法吗?

标签: c#asp.netasp.net-corenestedautomapper

解决方案


推荐阅读