[英]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.