0

感谢您的关注!

背景

在我的 C# 代码中,我从一个 MSSQL 数据库调用一个存储过程,它返回用户所下订单的历史记录。我为此使用实体框架。这是代码:

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id);

此存储过程的输出是一个订单列表,其中包含多个相同的记录,OrderNumber因为给定订单中可能有多个产品。所以我修改了我的代码,如下所示:

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id).GroupBy(p => p.OrderNumber);

我希望现在有一个Order包含嵌套Product对象的对象列表,但是这段代码基本上产生了与以前相同的响应。

最终,我只想将此查询转换为如下所示的 JSON 响应:

Orders : [
{
OrderNumber : 1,
OrderTotal: $500,
Products: [
  {ProductSku : 11111, ProductPrice: $200},
  {ProductSku : 22222, ProductPrice: $300}
]
}
]

我正在使用 MVC 4 来帮助生成 JSON 输出,所以我已经很清楚这部分了,我只需要知道如何以生成具有所需结构的对象数组的方式使用存储过程的结果。

问题

有没有办法通过对存储过程的原始 LINQ 调用来生成这种所需的对象结构,或者我是否需要迭代存储过程的结果并构造一个新对象?

谢谢你的帮助!

4

2 回答 2

2
var serializer = new JavaScriptSerializer();
var rows = db.GetOrderHistoryByUserId(id);
var json = serializer.Serialize(
       new { Orders = rows.GroupBy(o => o.Number)
                          .Select(g =>
                                new
                                {
                                    OrderNumber = g.Key,
                                    OrderTotal = g.Sum(o => o.Price),
                                    Products = g.Select(
                                       o => new {SKU = o.Sku, ProductPrice = o.Price}
                                    )
                                 })
            });
于 2012-11-02T00:00:30.337 回答
1

在发布之前,我实际上确实在早些时候寻求过帮助,但我刚刚得到了答案。我需要一个Select子句:

var db = new CustomerEntities();
return db.GetOrderHistoryByUserId(id).GroupBy(o => o.OrderNumber).Select(g => new {Order = g.Key, Items = g}); 

单击此处查看最终帮助我的网页。

希望这可以帮助某人。

于 2012-11-01T21:49:46.623 回答