【问题标题】:Automapper with Join query带有连接查询的自动映射器
【发布时间】:2021-07-03 09:07:01
【问题描述】:

我正在使用 AutoMapper 开发 .Net core 3 Web API

我有一个客户实体和订单实体。我已经为下面的每个创建了 DTO

 public partial class Customer
    {

        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }

  public class CustomerDto
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

   public partial class Order
    {
        public int OrderId { get; set; }
        public int? CustomerId { get; set; }
        public byte OrderStatus { get; set; }

        public virtual Customer Customer { get; set; }
        public virtual Staff Staff { get; set; }
        public virtual Store Store { get; set; }
        public virtual ICollection<OrderItem> OrderItems { get; set; }
    }
}

public class OrderDto
{
    public int OrderId { get; set; }
    public int? CustomerId { get; set; }
    public byte OrderStatus { get; set; }
}

现在在 CustomerRepository 我有一个函数可以返回客户数据并在下面的客户控制器中使用

   public async Task<IActionResult> GetCustomers ()
        {
            var result = await _repo.GetCustomers();
            
            return Ok(_mapper.Map<List<CustomerDto>>(result));
        }

到目前为止一切正常。我想在客户存储库中添加一个函数来返回客户数据以及他/她的订单列表

我尝试通过在 CustomerDto 中添加一个列表如下,但这对我来说是另一个问题

   public class CustomerDto
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<OrderDto> Orders { get; set; }
    }

现在,当我调用操作 GetCustomers 时,它会在 json 中返回一个空的 List&lt;OrderDto&gt;,这是有道理的。但我不想那样。我只想返回客户数据。

但是对于新功能,我想返回客户数据和订单列表。现在怎么办?

我认为我们不应该为我们所做的不同 SQL 连接查询创建不同的 DTO。那么这里的方法是什么?

【问题讨论】:

    标签: c# asp.net-web-api .net-core automapper dto


    【解决方案1】:

    我有一个类似的例子。

    您应该使用 AutoMapper ProjectTo 方法和 Include 方法。

    我的主要 dto。

    public class VariantViewDto : BaseDto, IDto
    {
        public int Id { get; set; }
        public string VariantName { get; set; }
        public bool IsActive { get; set; }
        public List<VariantValueViewDto> VariantValues { get; set; }
    }
    

    我的孩子 dto

    public class VariantValueViewDto : IDto
    {
        public int Id { get; set; }
        public int VariantId { get; set; }
        public string VariantName { get; set; }
        public string Value { get; set; }
    }
    

    自动映射器包括。

    var query = _variantRepository.GetQuery(); //It should be IQueryable
    query = query.Include(u => u.CreateUser);
    query = query.Include(u => u.UpdateUser);
    query = query.Include(u => u.VariantValues);
    var variantsViewDto = await _mapper.ProjectTo<VariantViewDto>(query).ToListAsync();
    return new SuccessDataResult<IEnumerable<VariantViewDto>>(variantsViewDto);
    

    结果

        {
            "id": 1,
            "variantName": "Renk",
            "isActive": true,
            "variantValues": [
                {
                    "id": 2,
                    "variantId": 1,
                    "variantName": "Renk",
                    "value": "Sarı"
                },
                {
                    "id": 3,
                    "variantId": 1,
                    "variantName": "Renk",
                    "value": "Kırmızı"
                }
            ],
            "createDate": "2021-06-21T16:44:11.451633",
            "updateDate": null,
            "createUserId": 37,
            "createUserName": "string",
            "updateUserId": null,
            "updateUserName": ""
        },
    

    【讨论】:

    • Include 不需要 ProjectTo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多