因此,我之前对 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());
我有以下问题:
我已经在我的存储库中使用它解决了部分问题,还更新了界面并通过控制器传递选项。
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);
}
解决上述问题的最佳方法是什么?