繁体   English   中英

如何使用 LINQ 使用双分组元素?

[英]How I can use double grouped elements using LINQ?

在我的项目中,我想先按项目分组双倍时间,然后按每天分组。 例如:Project X 用于 06.11.2020(300 美元价格)、07.11.2020(250 美元)等。我想达到这样的结果:

[
  {
    projectId: 1,
    projectName: 'Test',
    data: [
      {
        price: 22.000000176,
        startDate: '2020-11-06T00:00:00'
      },
      {
        price: 42.000000176,
        startDate: '2020-11-07T00:00:00'
      },
      {
        price: 62.000000176,
        startDate: '2020-11-08T00:00:00'
      },
    ],
  },
  {
    projectId: 2,
    projectName: 'Test 2',
    data: [
      {
        price: 333.000000176,
        startDate: '2020-11-06T00:00:00'
      },
      {
        price: 3333.000000176,
        startDate: '2020-11-07T00:00:00'
      },
      {
        price: 3333.000000176,
        startDate: '2020-11-08T00:00:00'
      },
    ],
  },
]

我在我的代码中尝试什么

public async Task<List<GroupedBillingInfo>> Handle(GroupedBillingListQuery request,
                CancellationToken cancellationToken)
            {
                var billing = _context.BillingSummaries.Where(x => x.Project.Organization.IsDeleted == false)
                    .AsQueryable();

          

                var demo = billing.ToList();

                var result = demo.GroupBy(x => new {
                        ProjectId = x.ProjectId,
                        Year = x.BeginApply.Year,
                        Month = x.BeginApply.Month,
                        Day = x.BeginApply.Day
                    })
                    .Select(y => new GroupedBillingInfo
                    {
                        ProjectId = y.Key.ProjectId,
                        ProjectName = y.Select(d => d.Project.Name).FirstOrDefault(),
                        Data = new List<GroupedBillings>
                        {
                            new GroupedBillings
                            {
                                StartDate = $"{y.Key.Year}/{y.Key.Month}/{y.Key.Day}",
                                Price = y.Sum(s => s.Price)
                            }
                        }
                    }).ToList();

                return result;
            }


        public class GroupedBillings
        {
            public string StartDate { get; set; }
            public decimal Price { get; set; }
        }

        public class GroupedBillingInfo
        {
            public List<GroupedBillings> Data { get; set; }
            public int ProjectId { get; set; }
            public string ProjectName { get; set; }
        }

在此之后,我得到了结果:

[
  {
    "data": [
      {
        "startDate": "2020/11/6",
        "price": 26.66666688
      }
    ],
    "projectId": 50,
    "projectName": "test-bug"
  },
  {
    "data": [
      {
        "startDate": "2020/11/6",
        "price": 33.333333599999996
      }
    ],
    "projectId": 38,
    "projectName": "tcpro-demo"
  },
  {
    "data": [
      {
        "startDate": "2020/11/6",
        "price": 40.00000032
      }
    ],
    "projectId": 53,
    "projectName": "loki-test"
  },
  {
    "data": [
      {
        "startDate": "2020/11/6",
        "price": 12.000000096
      }
    ],
    "projectId": 64,
    "projectName": "chaos"
  },
  {
    "data": [
      {
        "startDate": "2020/11/7",
        "price": 26.66666688
      }
    ],
    "projectId": 64,
    "projectName": "chaos"
  },
  {
    "data": [
      {
        "startDate": "2020/11/7",
        "price": 32.000000256
      }
    ],
    "projectId": 50,
    "projectName": "test-bug"
  },
  {
    "data": [
      {
        "startDate": "2020/11/7",
        "price": 40.00000032
      }
    ],
    "projectId": 38,
    "projectName": "tcpro-demo"
  },
  {
    "data": [
      {
        "startDate": "2020/11/7",
        "price": 48.000000384
      }
    ],
    "projectId": 53,
    "projectName": "loki-test"
  },
  {
    "data": [
      {
        "startDate": "2020/11/8",
        "price": 32.000000256
      }
    ],
    "projectId": 64,
    "projectName": "chaos"
  },
  {
    "data": [
      {
        "startDate": "2020/11/8",
        "price": 32.000000256
      }
    ],
    "projectId": 50,
    "projectName": "test-bug"
  },
  {
    "data": [
      {
        "startDate": "2020/11/8",
        "price": 40.00000032
      }
    ],
    "projectId": 38,
    "projectName": "tcpro-demo"
  },
  {
    "data": [
      {
        "startDate": "2020/11/8",
        "price": 48.000000384
      }
    ],
    "projectId": 53,
    "projectName": "loki-test"
  },
  {
    "data": [
      {
        "startDate": "2020/11/9",
        "price": 17.333333472
      }
    ],
    "projectId": 64,
    "projectName": "chaos"
  },
  {
    "data": [
      {
        "startDate": "2020/11/9",
        "price": 18.666666816
      }
    ],
    "projectId": 50,
    "projectName": "test-bug"
  },
  {
    "data": [
      {
        "startDate": "2020/11/9",
        "price": 23.333333519999996
      }
    ],
    "projectId": 38,
    "projectName": "tcpro-demo"
  },
  {
    "data": [
      {
        "startDate": "2020/11/9",
        "price": 28.000000224
      }
    ],
    "projectId": 53,
    "projectName": "loki-test"
  }
]

所以简而言之,我想要(项目和内部对象 -> 每日日期时间和价格总和,项目 x -> (06nov2020 -> price 300 || 07nov2020 -> price 100)

您不应该立即将其分组。 您希望选择具有唯一 projectId 的记录,并按日期分组。 它应该是两个不同的分组

            var result = demo
                .GroupBy(x => new {
                    ProjectId = x.ProjectId,
                    Year = x.BeginApply.Year,
                    Month = x.BeginApply.Month,
                    Day = x.BeginApply.Day
                })
                .GroupBy(x => new {
                    ProjectId = x.Key.ProjectId
                })
                .Select(y => new GroupedBillingInfo
                {
                    ProjectId = y.Key.ProjectId,
                    ProjectName = y.First().Select(d => d.Project.Name).First(),
                    Data = y.Select(z => new GroupedBillings
                    {
                        StartDate = $"{z.Key.Year}/{z.Key.Month}/{z.Key.Day}",
                        Price = z.Sum(s => s.Price)
                    }).ToList()
                }).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM