我有web api odata服务,我需要返回从LINQ查询生成的一些数据,这些数据会使实体变平。例如,我有一个订单列表,我在数据服务端使用LINQ生成新属性,以便我想返回计数介于0和100之间的订单数,然后是另一个具有介于两者之间的计数的属性101和200.等。这是一个简化的例子。
Public IHttpActionResult GetCustomData()
{
var query = (from o in Orders
select CustomerName = o.CustomerName,
LowerCount = o.OrderDetails.Where(f => f.Pieces >= 0 && f.Pieces <= 100).Count(),
MidCount = o.OrderDetails.Where(f => f.Pieces >= 101 && f.Pieces <= 200).Count(),
HighCount = o.OrderDetails.Where(f => f.Pieces >= 201).Count()
);
return Ok(query);
}
在我的WebApiConfig中,我使用以下代码的函数配置:
FunctionConfiguration getCustomData = builder.EntityType<Order>().Collection.Function("GetCustomData");
getCustomData.Returns<Object>();
url让我正确调用函数,但返回的json包含空数组。例如:如果要返回6条记录,那么Json将在内部有6个空[。]
我还尝试返回Newtonsoft.Json.Linq.JObject并使用Newtonsoft将LINQ序列化为Json,但后来我遇到了运行时错误。
“复杂类型'JToken'通过属性'Parent'引用自身。不允许复杂类型的递归循环。”
我知道我可以创建自定义类来解决这个问题,但必须有一些更简单的方法将通用Json发送到客户端,以便客户端可以解包和读取数据。
我也知道我可以将整个订单/订单详细信息发送给客户端,以便客户端可以“计算”数据,但我希望从Web服务中留下有效负载。
我觉得我很接近,因为客户端正在返回一个json数组,但数组是空的。
答案 0 :(得分:1)
您可以使用字符串作为返回类型。
Public IHttpActionResult GetCustomData()
{
var query = (from o in Orders
select CustomerName = o.CustomerName,
LowerCount = o.OrderDetails.Where(f => f.Pieces >= 0 && f.Pieces <= 100).Count(),
MidCount = o.OrderDetails.Where(f => f.Pieces >= 101 && f.Pieces <= 200).Count(),
HighCount = o.OrderDetails.Where(f => f.Pieces >= 201).Count()
);
return Ok(JsonConvert.SerializeObject(query));
}
FunctionConfiguration:
FunctionConfiguration getCustomData = builder.EntityType<Order>().Collection.Function("GetCustomData");
getCustomData.Returns<string>();