代码之家  ›  专栏  ›  技术社区  ›  joedotnot

使用linqto对象获取不同的

  •  0
  • joedotnot  · 技术社区  · 8 年前

    我的数据如下图所示 enter image description here

    List<dynamic> myList = new List<dynamic>()
            {
                new {
                    WorkOrderID = 40001,
                    LastUpdatedAt = DateTime.Parse("2018-10-02"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
                new {
                    WorkOrderID = 40001,
                    LastUpdatedAt = DateTime.Parse("2017-06-01"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
                new {
                    WorkOrderID = 40002,
                    LastUpdatedAt = DateTime.Parse("2018-07-01"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
                new {
                    WorkOrderID = 40003,
                    LastUpdatedAt = DateTime.Parse("2018-09-01"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
                new {
                    WorkOrderID = 40001,
                    LastUpdatedAt = DateTime.Parse("2016-01-01"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
                new {
                    WorkOrderID = 40002,
                    LastUpdatedAt = DateTime.Parse("2016-12-01"),
                    Col3 = "abc",
                    Col4 = "xyz"
                },
            };
    

    如何使用linqto对象仅提取最近更新的不同工单。

    换句话说,我应该以橙色突出显示的3行结束。

    3 回复  |  直到 8 年前
        1
  •  2
  •   ProgrammingLlama Raveena Sarda    8 年前

    如果我没有误解,你想要每个工作订单的最新产品。

    var latestWorkOrders = myList
        .GroupBy(w => w.WorkOrderID)
        .Select(g => g.OrderByDescending(w => w.LastUpdatedAt).First());
    

    它将按 WorkOrderID ,并为每个分组选择最新的项。

        2
  •  2
  •   Nkosi    8 年前

    GroupBy 重载,以便可以在同一调用中选择元素,并将它们转换为强类型匿名对象。

    var myFilteredList = myList
        .GroupBy(_ => (int)_.WorkOrderID, (k, g) =>
        {
            var recent = g.OrderByDescending(_ => _.LastUpdatedAt).First();
            return new
            {
                WorkOrderID = k,
                LastUpdatedAt = (DateTime)recent.LastUpdatedAt,
                Col3 = (string)recent.Col3,
                Col4 = (string)recent.Col4
            };
        });
    

    Fiddle

        3
  •  0
  •   Gauravsa    8 年前
    List<dynamic> list = myList
                   .GroupBy(a => a.WorkOrderID )
                   .OrderByDescending(b => b.LastUpdatedAt)
                   .Select(g => g.FirstOrDefault())
                   .ToList();
    
    foreach (var p in list)
    {
        Console.WriteLine(p.WorkOrderID + " : " + p.Col3);
    }
    

    就个人而言,动态不是一个好的选择。如果你有一个对象,那么你可以实现 Equals 和 GetHashCode 在物体上。您可以这样做:

    var list = myList.Select(o => new { o.WorkOrderID, ... })
                                           .Distinct();
    

    更干净。