Search code examples
linqasp.net-coreentity-framework-coresql-order-by

How to order items in a list of dictionaries


I Would like to return children and grandchildren records(i.e. itemNo) in the order they are updated to database. Below query sorts record by itemNo ASC (by default). I believe sorting by Timestamp, will return records in the same order they are updated.

I tried adding Timestamp as below but doesn't work as expected.

Query to return children and grandChildren:

public async Task<List<Child>> GetChild(string parentItemNo)
{
           return await DbContext.Items
                .Where(x => x.ItemNo== parentItemNo)
                .SelectMany(x => x.Children.OrderByDescending(t => t.Timestamp).Select(c => new Child
                    {
                        ItemNo = c.ItemNo,
                        ItemName = c.ItemName,  
                        Timestamp = c.Timestamp,
                        GrandChildItemNos = c.Children.OrderByDescending(t => t.Timestamp).Select(gc => 
                           new GrandChild 
                           { 
                              ItemNo = gc.ItemNo, 
                              ItemName = gc.ItemName,
                              Timestamp = gc.Timestamp,
                           })  
                    })).ToListAsync();       // may i know how iadd orderBy here
 }

Below is how my responseData look:

[
    {"itemNo":"1111","itemName":"A1111", "timestamp":"AAAAAoc5I/o=", "grandChildSerialNos":[]}, 
    {"itemNo":"2222","itemName":"B2222"," "timestamp":"AAAAAoc5I/s=", "grandChildSerialNos":[]},
    {"itemNo":"3333","itemName":"C3333", "timestamp":"AAAAAoc5I/0=", "grandChildSerialNos": 
         [
             {"itemNo":"1234","itemName":"CH1234"..}, 
             {"itemNo":"5678","itemName":"CH5678"...}
         ]
    },      
    {"itemNo":"4444","itemName":"D4444", "timestamp":"AAAAAoc5I/4=" "grandChildSerialNos":[]}
   {"itemNo":"5555","itemName":"E5555", "timestamp":"AAAAAoc5I/w=" "grandChildSerialNos":[]}
]

I want responseData to return ItemNo "5555" before "3333" & "4444" (as "5555" was updated before 3333 & 4444). But response is not returned in that order. I want 'ItemNo' to be sorted by 'Timestamp' instead of ascending order.

Model class as below:

public partial class Item
{
    public byte[] Timestamp { get; set; }
    public string itemNo { get; set; }  
    public string itemName { get; set; } 
}

public class GrandChild
{
    public string ItemNo {get;set;}
    public string ItemName {get;set;}
    public byte[] Timestamp { get; set; }
}

public class Child
{
    public string ItemNo {get;set;}
    public string ItemName {get;set;}   
    public byte[] Timestamp { get; set; }
    public IEnumerable<GrandChild> GrandChildItemNos {get;set;}
}

Solution

  • Have you tried something like this?

    await DbContext.Items.Where(x => x.ItemNo == parentItemNo)
                    .SelectMany(x => x.Children)
                    .OrderByDescending(t => t.Timestamp).Select(c => new Child
                    {
                        ItemNo = c.ItemNo,
                        ItemName = c.ItemName,
                        Timestamp = c.Timestamp,
                        GrandChildItemNos = c.GrandChildItemNos.OrderByDescending(t => t.Timestamp).Select(gc =>
                              new GrandChild
                              {
                                  ItemNo = gc.ItemNo,
                                  ItemName = gc.ItemName,
                                  Timestamp = gc.Timestamp,
                              })
                    }).ToListAsync();