繁体   English   中英

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

[英]Using LINQ, How do I return objects from a GroupBy clause?

感谢您的光临!

背景

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

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

此存储过程的输出是订单列表,其中多个记录具有相同的OrderNumber因为给定订单中可能有多个产品。 所以我修改了代码,使其看起来像这样:

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

我希望现在有了包含嵌套的Product对象的Order对象的列表,但是该代码实际上产生了与以前相同的响应。

最终,我只想将此查询转换为类似于以下内容的JSON响应:

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

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

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

谢谢你的帮助!

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}
                                    )
                                 })
            });

实际上,在发布之前,我确实在此方面寻求帮助,但是我刚巧想到了答案。 我需要一个Select子句:

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

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

希望这对某人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM