如何使用LINQ进行双重分组?

3
在下面的数据中,我想找到每个唯一父级有多少个唯一订单。
    [Fact]
    public void Test()
    {
        var data = new Order[]
        {
            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },
            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },
            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },

            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },
            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },
            new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },

            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },
            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },
            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },

            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 44 },
            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 44 },

            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 55 },
            new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 55 },
        };


         var queryResult = data
            .GroupBy(x => x.OrderID)
            .Select(x => new
            {
                x.First().ParentID,
                x.First().ParentName,
            })
            .ToList();

        var result = queryResult.GroupBy(x => new { x.ParentID, x.ParentName })
            .Select(x => new Result()
            {
                ParentID = x.Key.ParentID,
                ParentName = x.Key.ParentName,
                Count = x.Count()
            })
            .ToList();

        Assert.Equal(2, result.Count);

        var firstParent = result.Where(x => x.ParentID == 1).SingleOrDefault();
        Assert.Equal(2, firstParent.Count);

        var secondParent = result.Where(x => x.ParentID == 2).SingleOrDefault();
        Assert.Equal(3, secondParent.Count);

    }

上面的代码是可行的。但我想检查是否有更好(优化)的方法来做到这一点。数据可能有1000多条记录。

dotnetfiddle演示


为什么不直接使用 Select(xg => xg.First()) 来处理第一个 queryResult - NetMage
请注意,GroupBy(f).Select(g => g.First()) 是实现 DistinctBy(f) 的简单方法。 - NetMage
1个回答

1
我希望找到每个唯一父级有多少唯一订单。
简单来说,将所有订单按其父级(无论如何进行标识)分组,然后计算这些组中不同订单的数量(具有唯一的 OrderId 字段)。
var result =
    (from o in data
    group o.OrderId by new { o.ParentId, o.ParentName } into g
    select new Result
    {
        ParentId = g.Key.ParentId,
        ParentName = g.Key.ParentName,
        Count = g.Distinct().Count(),
    })
    .ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接