函数结果复杂类型序列化OData 6.0.0

时间:2016-12-09 13:57:44

标签: c# serialization asp.net-web-api2 odata

我将OData版本更新为6.0.0。

在更新之前我有一个函数声明,如:

var getResult = odataBuilder.EntityType<Customer>().Collection.Function("GetResult");
    getResult.Parameter<int>("Number");
    getResult.Returns<ResultDto>();

ResultDto具有结构:

    public class ResultDto
{
    public string CustomerName { get; set; }
    public IList<ResultComponentsDto> ResultComponentsDtos { get; set; }
}

ResultComponentsDto具有结构:

    public class ResultComponentsDto
{
    public string Description { get; set; }
    public IList<Product> Products { get; set; }
}

产品是实体的地方。

该函数将返回正确的数据:

[HttpGet]
    public async Task<IHttpActionResult> GetResult(int number)
    {
        var result = new ResultDto
        {
            CustomerName = "Test",
            ResultComponentsDtos = new List<ResultComponentsDto>
            {
                new ResultComponentsDto
                {
                    Description = "Test 1",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Id = Guid.NewGuid(),
                            Name = "1"
                        },
                        new Product
                        {
                            Id = Guid.NewGuid(),
                            Name = "2"
                        },
                    }
                },
                new ResultComponentsDto
                {
                    Description = "Test 2",
                    Products = new List<Product>
                    {
                        new Product
                        {
                            Id = Guid.NewGuid(),
                            Name = "3"
                        },
                        new Product
                        {
                            Id = Guid.NewGuid(),
                            Name = "4"
                        },
                    }
                }
            }
        };
        return Ok(result);
    }

我的问题是在更新后我无法获得完整的结果,我只得到以下结果序列化:

    {  
   "@odata.context":"http://localhost:3721/$metadata#WebApi.Dto.ResultDto",
   "CustomerName":"Test",
   "ResultComponentsDtos":[  
      {  
         "Description":"Test 1"
      },
      {  
         "Description":"Test 2"
      }
   ]
}

在更新此工作之前,ResultComponentsDto中的产品集合未被序列化。由于复杂类型的序列化程序已更改: see here如何获得与之前版本相同的结果?

我尝试了什么:

  1. 启用查询参数: [EnableQuery(MaxExpansionDepth = 4)]
  2. 使用autoexpand设置为true在模型构建器中配置complext类型:

            var result = odataBuilder.ComplexType<ResultDto>();
        result.Property(r => r.CustomerName);
        var resultComponents = result.CollectionProperty(r => r.ResultComponentsDtos);
        resultComponents.AutoExpand = true;
    
        var resultComponentsComplexType = odataBuilder.ComplexType<ResultComponentsDto>();
        resultComponentsComplexType.Property(rc => rc.Description);
        var products = resultComponentsComplexType.HasMany(rc => rc.Products);
        products.AutoExpand = true;
        products.AutomaticallyExpand(false);
    
  3. 使用autoexpand属性: [自动扩展] 公共IList产品{get;组; }

  4. 手动扩展请求(unsing $ expand),目前这种方式不适用于Complext类型。

  5. 提前致谢, 米哈伊

1 个答案:

答案 0 :(得分:0)

我有同样的问题。 我建议你将输出结果更改为字符串。如波纹管。 getResult.Returns&LT;字符串&gt; ();

然后在getResult方法中将结果对象转换为json字符串。 返回Ok(JsonConvert.SerializeObject(result))

在客户端中,您必须将输出字符串DeSerialize为object。