.NET服务OData从LINQ查询返回匿名类型

时间:2014-04-26 04:23:58

标签: c# json linq odata wcf-data-services

我有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数组,但数组是空的。

1 个答案:

答案 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>();