【问题标题】:.NET service OData return anonymous type from LINQ query.NET 服务 OData 从 LINQ 查询返回匿名类型
【发布时间】: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


【解决方案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 getCustomData = builder.EntityType<Order>().Collection.Function("GetCustomData");
getCustomData.Returns<string>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多