返回与查询选项不同的odata IQueryable对象

时间:2014-08-12 01:07:58

标签: asp.net-web-api odata

我需要使用以下代码

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

我想查询TillSummaryDTO,因为它有字段&#34; TillOpID&#34;在上面。但是我想返回BankingDTO,因为这是包含group by和sum的最终结果。当我运行查询时,我收到错误&#34;无法应用&#39; Bepoz.Presentation.ViewModels.TillSummaryDTO&#39;的ODataQueryOptions。 to Beuz.Presentation.ViewModels.BankingDTO&#34;这是什么最好的做法?

bankingservice.GetBanking方法看起来像这样

    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
        });

1 个答案:

答案 0 :(得分:1)

您想要实现的方案是您要查询的TillSummaryDTO实体集,并且您希望返回类型是BankingDTO的集合。通过将URL中的查询选项应用到TillSummaryDTO来执行BankingDTO的查询。但是BankingDTO和TillSummaryDTO是不同类型的事实使得在一个简单的Get动作方法中无法实现,对吧?

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

对于OData协议中的函数概念,您可以参考this link获取V4和部分&#34; 10.4.2。功能&#34; V3的this page

对于实现,可以参考Web API OData V4 this sample,Web API OData V3可以引用this tutorial