【发布时间】:2014-04-26 04:23:58
【问题描述】:
我有 web api odata 服务,我需要返回一些从展平实体的 LINQ 查询生成的数据。例如,我有一个订单列表,我在数据服务端使用 LINQ 生成新属性,这样我想返回计数在 0 到 100 之间的订单数,然后返回另一个计数在 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 代码如下:
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 数组但数组是空的。
【问题讨论】:
-
你可以试试getCustomData.Returns
()并在方法Public IHttpActionResult GetCustomData()中返回通用的json字符串吗?
标签: c# json linq odata wcf-data-services