C# Linq efficient way to group by without repetition of key value

Viewed 131

So I have the following data:

orders: 
[
    {id: 1, hubId: 1, number:1, IsTrue: true},
    {id: 2, hubId: 1, number:2, IsTrue: true},
    {id: 3, hubId: 1, number:3, IsTrue: false},
    {id: 4, hubId: 2, number:4, IsTrue: true},
    {id: 5, hubId: 2, number:5, IsTrue: true},
    {id: 6, hubId: 2, number:6, IsTrue: false}
]

I need to create a Linq query that groups the orders according to the hub Id and outputs the result in the following format

result: 
[
    {
        hubId: 1, 
        orders: 
            [
                {id: 1, number: 1},
                {id: 2, number: 2},
            ]
    },
    {
        hubId: 2, 
        orders: 
            [
                {id: 4, number: 4},
                {id: 5, number: 5},
            ]
    }
]

How do I write the linq query to acheive the wanted result?

My initial query which is not yeilding the result format I require

var orders = _ordersRepo.GetQueryable<Order>().AsNoTracking()
    .Where(o => o.IsTrue)
    .Select(o => new  
    {
        hubId = o.hubId,
        number = o.number,
        id = o.id
    }).ToList()
    .GroupBy(o => o.hubId)

return orders;
1 Answers

Do it the other way around - first GroupBy, then select the orders from each group:

var orders = _ordersRepo.GetQueryable<Order>().AsNoTracking()
  .Where(o => o.IsTrue)
  .GroupBy(o => o.hubId)
  .Select(group => new
    {
      hubId = group.Key,
      orders = group.Select(o => new { id = o.Id, number = o.Number }).ToList();
    })
  .ToList();

You can also use the GroupBy overload which produces the resulting object right away:

var orders = _ordersRepo.GetQueryable<Order>().AsNoTracking()
  .Where(o => o.IsTrue)
  .GroupBy(
    o => o.hubId,
    (hubId, orders) => new
    {
      hubId = hubId,
      orders = orders.Select(o => new { id = o.Id, number = o.Number }).ToList()
    })
  .ToList();
Related