WebApi OData格式化程序不适用于子元素

时间:2013-06-16 05:09:49

标签: asp.net-web-api odata

以下代码将ViewModel查询转换为model,然后将返回的结果作为PageResult转换回ViewModel。所有这一切工作正常,但当我尝试使用include作为我的默认查询的一部分(或甚至最新版本作为querycontext的一部分),然后OData格式化程序播放有趣,不包括子元素。我已经调试并确认它实际上包含子元素。这只发生在我从ODataController扩展的控制器上(所以基本上对于从ApiController扩展的控制器都工作正常,但我需要OData格式的结果)。 请注意,我也尝试过最新的每晚版本(Microsoft.Data.OData 5.5.0.0),但它仍然不适用于我。 任何帮助都将受到高度赞赏。

public class ProductsController : ODataController
    {
        APPContext context = new APPContext();

        public PageResult<ProductViewModel> Get(ODataQueryOptions QueryOptions)
        {
            EdmModel model = new EdmModel();
            ODataQueryContext queryContext = new ODataQueryContext(model.GetEdmModel(), typeof(Product));
            var mappedQuery = new ODataQueryOptions(queryContext, QueryOptions.Request);
            var results = new List<ProductViewModel>();

            foreach (var result in mappedQuery.ApplyTo(this.context.Serials.Include("Status").Include("Category")))
            {
                AutoMapper.Mapper.CreateMap(result.GetType(), typeof(ProductViewModel));
                results.Add(AutoMapper.Mapper.Map<ProductViewModel>(result));
            }

            PageResult<ProductViewModel> pr = new PageResult<ProductViewModel>(results.AsEnumerable<ProductViewModel>(), mappedQuery.Request.GetNextPageLink(), mappedQuery.Request.GetInlineCount());
            return pr;
        }
    }

1 个答案:

答案 0 :(得分:1)

在OData中,相关实体表示为导航链接。因此,如果您有客户Feed,则每个客户的相关订单将不会成为客户Feed的一部分。相反,它们将表示为导航链接。您可以使用$expand查询选项明确告诉OData服务扩展相关实体。因此,如果您希望扩展每个客户的相关订单,则应该询问网址~/Customers?$expand=Orders