首页 > 解决方案 > 如何使用 LINQ 进行双重分组

问题描述

在下面的数据中,我想为每个唯一父级查找有多少个唯一订单

    [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 演示

标签: c#performancelinq

解决方案


我想为每个独特的父母找到有多少独特的订单

很简单,获取所有订单,按其父级对它们进行分组(无论您如何识别它们),然后计算这些组(具有唯一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();

推荐阅读