Как сделать двойную группировку с помощью LINQ - PullRequest
3 голосов
/ 26 июня 2019

В приведенных ниже данных я хочу найти для каждого уникального родителя, сколько существует уникальных заказов

    [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 demo

1 Ответ

1 голос
/ 27 июня 2019

я хочу найти для каждого уникального родителя, сколько существует уникальных заказов

Проще, принять все заказы, сгруппировать их по родителям (как вы их идентифицируете), а затем подсчитать различные заказы из этих групп (те, которые имеют уникальные 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...