【问题标题】:Using LINQ, How do I return objects from a GroupBy clause?使用 LINQ,如何从 GroupBy 子句返回对象?
【发布时间】:2013-11-03 23:58:11
【问题描述】:

感谢收看!

背景

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

感谢您的帮助!

【问题讨论】:

  • 有什么特殊原因导致被否决吗??

标签: c# sql linq entity-framework


【解决方案1】:
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}
                                    )
                                 })
            });

【讨论】:

    【解决方案2】:

    实际上我在发帖之前确实在此之前寻求过帮助,但我刚刚得到了答案。我需要一个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.

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多