使用LINQ,如何从Group By子句返回对象?

时间:2012-11-01 21:32:54

标签: c# sql linq entity-framework

感谢您的期待!

背景

在我的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调用来生成所需的对象结构,或者我是否需要迭代存储过程的结果并构造新对象?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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}
                                    )
                                 })
            });

答案 1 :(得分:1)

在发布之前,我确实在早些时候寻找过这方面的帮助,但我刚刚回答了问题。我需要一个Select条款:

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

Click here to see the webpage that finally helped me.

希望这有助于某人。