Asp.net web api 返回与查询选项不同的odata IQueryable对象

Asp.net web api 返回与查询选项不同的odata IQueryable对象,asp.net-web-api,odata,Asp.net Web Api,Odata,我需要让下面的代码工作 public IQueryable<BankingDTO> Get(ODataQueryOptions<TillSummaryDTO> options) { return((IQueryable<BankingDTO>)options.ApplyTo(this._bankingService.GetBanking())); } 您希望实现的场景是,您有一个

我需要让下面的代码工作

        public IQueryable<BankingDTO> Get(ODataQueryOptions<TillSummaryDTO> options)
        {
            return((IQueryable<BankingDTO>)options.ApplyTo(this._bankingService.GetBanking()));    
        }

您希望实现的场景是,您有一个要查询的TillSummaryDTO实体集,并且希望返回类型是BankingDTO的集合。通过将URL中的查询选项应用于TillSummaryDTO,可以执行BankingDTO的查询。但是BankingDTO和TillSummaryDTO是不同类型的,这一事实使得用一个简单的Get操作方法不可能实现这一点,对吗

OData协议的函数特性可以更好地解决这种情况,该函数将TillSummaryDTO集合作为输入参数,具有一些内部复杂的逻辑来查询正确的BankingDTO,并返回BankingDTO而不是TillSummaryDTO

对于OData协议中的功能概念,您可以参考V4和V3的“10.4.2.功能”部分

对于实现,可以参考Web API OData V4,也可以参考Web API OData V3

    var query = from t in _tillSummaryRepository.Table
        join w in _workStationRepository.Table on t.TillOpID equals w.WorkstationID
        join s in _storeRepository.Table on w.StoreID equals s.StoreID
        join v in _venueRepository.Table on s.VenueID equals v.VenueID
        select new TillSummaryDTO
        {
            TillOpID = t.TillOpID,
            Cash = t.Cash,
            Workstation = new WorkstationDTO()
            {
                WorkstationID = w.WorkstationID,
                Name = w.Name,
                Store = new StoreDTO()
                {
                    StoreID = s.StoreID,
                    StoreGroup = s.StoreGroup,
                    Name = s.Name,
                    Venue = new VenueDTO()
                    {
                        VenueID = v.VenueID,
                        VenueGroup = v.VenueGroup,
                        Name = v.Name,
                    }
                }
            }
        };

    return query.GroupBy(x => x.Workstation.Name)
        .Select(x => new BankingDTO()
        {
            TotalCash = x.Sum(y => y.Cash),
            WorkstationName = x.Key
        });