EF Core 和 OData 自动映射器扩展(将 OData 投影到 DTO)

问题描述 投票:0回答:1

因此,我之前对 API 的工作方式存在疑问,因为我收到了正确的响应,但对数据库的 EF 查询需要进行更多调用。

经过研究,我找到了可以使用的库https://github.com/AutoMapper/AutoMapper.Extensions.OData

我的问题是设置它,大多数示例都直接在实体上(但我使用带有 DTO 等的存储库模式)。

所以我有:

控制器

public OrdersController(IOrderRepository orderRepository, IMapper mapper)
{
  _orderRepository = orderRepository;
  _mapper = mapper;
}

[EnableQuery]
public async Task<ActionResult<IEnumerable<OrderDto>>> Get()
{
  var orders = await _orderRepository.GetOrdersAsync();
  return Ok(orders);
}

存储库

public OrderRepository(DataContext context, IMapper mapper)
{
  _context = context;
  _mapper = mapper;
}

public async Task<IEnumerable<OrderDto>> GetOrdersAsync()
{
  return await _context.Orders
    .ProjectTo<OrderDto>(_mapper.ConfigurationProvider)
    .AsSplitQuery()
    .ToListAsync();    
}

DTO

public class OrderDto
{
  public int Id { get; set; }
  public string? Name { get; set; }
  public List<CategoryDto>? Categories { get; set; } = new List<CategoryDto>();
}

自动映射器

AllowNullCollections = true;

CreateMap<Order, OrderDto>().ForAllMembers(opt => opt.ExplicitExpansion());

我有以下问题:

  • 不知道如何配置我的存储库和控制器
  • 现在调用 /api/Orders 会返回 Id 和 Name。但如果我展开它不会显示类别(只是再次显示 ID 和名称)。
  • 我只添加了自动映射器配置,没有其他任何改变。不知道在哪里添加选项等。
asp.net entity-framework odata automapper
1个回答
0
投票

我已经在我的存储库中使用它解决了部分问题,还更新了界面并通过控制器传递选项。

public async Task<IEnumerable<OrderDto>> GetOrdersAsync(ODataQueryOptions<OrderDto> options)
    {
    //    return await _context.Orders
    //             .ProjectTo<OrderDto>(_mapper.ConfigurationProvider)
    //             .AsSplitQuery()
    //             .ToListAsync();

        return await _context.Orders.GetAsync(_mapper, options);
    }

GetAll 按预期工作正常,但它破坏了我的 GetId。我收到空值,需要使用与 GetAll 相同的方式更新它。最有可能的是带有 dto 的自动映射器配置破坏了它,这是我现在的代码:

public async Task<OrderDto?> GetOrderByIdAsync(int orderId)
{
    return await _context.Orders
        .ProjectTo<OrderDto>(_mapper.ConfigurationProvider)
        .SingleOrDefaultAsync(x => x.Id == orderId);
}

解决上述问题的最佳方法是什么?

© www.soinside.com 2019 - 2024. All rights reserved.