我需要使用以下代码
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
});
答案 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。