【问题标题】:WebApi OData formatter doesn't work for child elementsWebApi OData 格式化程序不适用于子元素
【发布时间】:2013-06-16 05:09:48
【问题描述】:

以下代码将 ViewModel 查询转换为模型,然后将返回的结果作为 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;
        }
    }

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

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

    【讨论】:

    • 甚至使用最新版本作为 querycontext 的一部分我实际上是指 $expand 这里。对于没有具体说明,我提前道歉。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2023-03-22
    • 2015-03-07
    • 2021-06-18
    相关资源
    最近更新 更多