我有以下表达式:
var products = loadOrdr.Payload.LoadOrderVehicles.SelectMany(l => l.LoadOrderComps)
.Select(t => t.Transfer)
.GroupBy(p => p.Product.Name)
.Select(s => s.Sum(p => p.DelVolumeData.VL)).toList();
我有一个列表,其中包含以下信息:
---Product--- ---Value---
M1 10
M1 10
M1 10
M2 10
M2 10
列表可以有所不同,包含更多棕褐色的两个项目,我想将其分组,使其看起来像:
---Product--- ---SumValue---
M1 30
M2 20
对象结构:
public class LoadOrderVehicle : DomainBase
{
public long LoadOrderId { get; set; }
[DBIgnore]
public List<LoadOrderComp> LoadOrderComps { get; set; }
}
public class LoadOrderComp : DomainBase
{
public long LoadOrderVehicleId { get; set; }
[DBIgnore]
public Transfer Transfer { get; set; }
[DBIgnore]
public VehicleComp VehicleComp { get; set; }
}
// data I want to group is here:
public class Transfer : DomainBase
{
[DBIgnore]
public VolumeData OrdVolumeData { get; set; }
[DBIgnore]
public Product Product { get; set; }
}
Linq不是我强大的一面,我自己的linq没有任何结果。 我该如何解决这个问题?
答案 0 :(得分:2)
您可以尝试这样的事情:
var products = loadOrdr.Payload
.LoadOrderVehicles
.SelectMany(l => l.LoadOrderComps)
.Select(t => t.Transfer)
.GroupBy(p => p.Product.Name)
.Select(gr => new
{
ProductName = gr.Key,
Total = gr.Sum(p => p.DelVolumeData.VL)
})
.ToDictinary(x=>x.ProductName, x=>x.Total);
您遇到的唯一问题是Select
之后的最后一次投影GroupBy
。在那里,您需要进行分组的密钥以及相应组项的DelVolumeData.VL
总和。
答案 1 :(得分:2)
您只需:
.GroupBy(p => p.Product.Name,(pk,s) =>
new {
Key = pk,
Sum = s.Sum(p => p.DelVolumeData.VL)
})
这将导致IEnumerable<Anonymous{string,int}>
,假设Name
为string
,p.DelVolumeData.VL
为int
现在您可以致电ToDictionary
并获取Dictionary<string,int>
修改后的代码:
var products = loadOrdr.Payload.LoadOrderVehicles
.SelectMany(l => l.LoadOrderComps)
.Select(t => t.Transfer)
.GroupBy(p => p.Product.Name,
(pk,s) =>
new {
Key = pk,
Sum = s.Sum(p => p.DelVolumeData.VL)
})
.ToDictionary(p => p.Key,p => p.Sum);
答案 2 :(得分:0)
感谢您的回复,但上述内容都没有给我带来惊人的结果。在朋友的帮助下,我解决了这个问题。我为迟到的回复道歉,我在部署之前还有其他的事情要做。
这有效:
var transfers = loadOrdr.Payload.LoadOrderVehicles
.SelectMany(lov => lov.LoadOrderComps)
.Select(loc => loc.Transfer);
var products = transfers
.GroupBy(t => t.Product.Name)
.ToDictionary(
g => g.Key,
g => transfers
.Where(x => x.Product.Name.Equals(g.Key))
.Sum(y => y.DelVolumeData.VL));