我将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如何获得与之前版本相同的结果?
我尝试了什么:
使用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);
使用autoexpand属性: [自动扩展] 公共IList产品{get;组; }
手动扩展请求(unsing $ expand),目前这种方式不适用于Complext类型。
提前致谢, 米哈伊
答案 0 :(得分:0)
我有同样的问题。 我建议你将输出结果更改为字符串。如波纹管。 getResult.Returns&LT;字符串&gt; ();
然后在getResult方法中将结果对象转换为json字符串。 返回Ok(JsonConvert.SerializeObject(result))
在客户端中,您必须将输出字符串DeSerialize为object。