.net core 如何在.NETCore3.1中结合OData4和Automapper

.net core 如何在.NETCore3.1中结合OData4和Automapper,.net-core,odata,automapper,.net Core,Odata,Automapper,我试图在.NETCore3.1中结合Automapper和OData,但我已经被困了一段时间。我的OData控制器通过以下方式工作: [ODataRoute] [EnableQuery] public IQueryable<Unit> Get() { return _context.Units; } 但这会导致空引用异常: [HttpGet] public async Task<IActionResult> GetAll(ODataQueryOptions<

我试图在.NETCore3.1中结合Automapper和OData,但我已经被困了一段时间。我的OData控制器通过以下方式工作:

[ODataRoute]
[EnableQuery]
public IQueryable<Unit> Get()
{
    return _context.Units;
}
但这会导致空引用异常:

[HttpGet]
public async Task<IActionResult> GetAll(ODataQueryOptions<UnitDto> options)
{
    return Ok(await _context.Units.GetQueryAsync(_mapper, options));
}
System.NullReferenceException:对象引用未设置为对象的实例

在lambda_方法(闭包、QueryContext、DbDataReader、ResultContext、Int32[],ResultCoordinator)
位于Microsoft.AspNetCore.Mvc.Infrastructure.AsyncEnumerableReader.ReadInternal[T](对象值)的Microsoft.AspNetCore.Mvc.Infrastructure.AsyncEnumerableReader.ReadInternal[T](对象值)的Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.AsyncEnumerator.MoveNextAsyncAsync()在Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncEnumerable(ActionContext上下文、ObjectResult结果、Object asyncEnumerable、Func
2 reader)中
等等

使用
Automapper.Aspnetcore.Odata.EFCore
getquerysync
会导致相同的异常:

[HttpGet]
public async Task<IActionResult> GetAll(ODataQueryOptions<UnitDto> options)
{
    return Ok(await _context.Units.GetQueryAsync(_mapper, options));
}
[HttpGet]
公共异步任务GetAll(ODataQueryOptions选项)
{
返回Ok(wait_context.Units.getQuerySync(_mapper,options));
}

关于如何实现这一点有什么想法吗?这就是我要走的路,我做错了什么,还是应该走另一个方向?

最后,我找到了一个解决办法。所以假设更多的人有这个问题,下面是我做了什么使它工作

第一件事是对数据库对象执行查询。然后获取它们的结果(使用JSON(反)序列化,不知道更好的方法)并将它们映射到DTO对象

[ODataRoute]
[EnableCustomQuery]
public IEnumerable<UnitDto> Get(ODataQueryOptions<Unit> opts)
{
       var queryResult = opts.ApplyTo(_context.Units);

       var units = _mapper.Map<List<Unit>>(JsonConvert.DeserializeObject<List<UnitOData>>(JsonConvert.SerializeObject(queryResult)));

       return _mapper.Map<List<UnitDto>>(units);
 }
反序列化的结果现在将是数据库对象,其中一个属性在筛选特定属性时发生更改。因此,我创建了一个新的
UnitOData

public class UnitOData : Unit
{
    public string DisplayName { get; set; }
}
并根据特定属性是否存在将其映射到原始对象

CreateMap<UnitOData, Unit>()
     .ForMember(a => a.InternalReference, opt => opt.MapFrom(src => src.ExternalReference ?? src.InternalReference));
如果有真正的解决方案,请分享

CreateMap<UnitOData, Unit>()
     .ForMember(a => a.InternalReference, opt => opt.MapFrom(src => src.ExternalReference ?? src.InternalReference));
public class EnableCustomQueryAttribute : EnableQueryAttribute
{
    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
    {
        var ignoreQueryOptions = AllowedQueryOptions.Skip | AllowedQueryOptions.Top;
        return queryOptions.ApplyTo(queryable, ignoreQueryOptions);
    }
}