C# 使用linq获取compleJSON结构的总和

C# 使用linq获取compleJSON结构的总和,c#,json,linq,C#,Json,Linq,我有一个复杂的json结构(至少对我来说)看起来像 { "Assets": [{ "Name": "asset1", "Code": "SS-15", "Items": [{ "Name": "Item1", "KGs": 255, "Cartons": 1222, "Containers": 3

我有一个复杂的json结构(至少对我来说)看起来像

{
"Assets": [{
        "Name": "asset1",
        "Code": "SS-15",
        "Items": [{
                "Name": "Item1",
                "KGs": 255,
                "Cartons": 1222,
                "Containers": 3
            }, {
                "Name": "Item2",
                "KGs": 150,
                "Cartons": 2322,
                "Containers": 5
            }
        ]
    }, {
        "Name": "asset2",
        "Code": "SA-23",
        "Items": [{
                "Name": "Item1",
                "KGs": 88,
                "Cartons": 40,
                "Containers": 1
            }, {
                "Name": "Item2",
                "KGs": 960,
                "Cartons": 710,
                "Containers": 31
            }
        ]
    }
]}
我需要在全球范围内总结每种商品的重量、纸箱和集装箱,如下所示:

[{
    "unit": "KGs",
    "Item1": 343,
    "Item2": 1110

}, {
    "unit": "Cartons",
    "Item1": 1262,
    "Item2": 3032
}, {
    "unit": "Containers",
    "Item1": 4,
    "Item2": 36
}]
我一直在使用LINQ,到目前为止,我有一些类似于:

object.SelectMany(x => x.Items.GroupBy(k => k.Name, m => m.KGs)).GroupBy(g => g.Key);
它看起来像我在寻找的东西,但没有给我我需要的信息


注意:我正在将json反序列化到我的项目中的一个类。

我不知道您是否会对此发笑,因为它与您期望的相去甚远,但我在这段代码中看到的主要问题是,您试图将集合中的项(Item1,Item2)转换为对象中的属性(“Item1”:4,“Item2”:36),这迫使我考虑使用ExpandooObject类动态创建对象:

(必须安装并导入才能使用DistinctBy)


我并不是说单用一个Linq查询就不可能做到这一点,但我并没有看得那么清楚,也许有更聪明和/或有更多可用时间的人可以实现这一点

如果这不是您需要的信息,它会给您什么?另外,我不会在你的
GroupBy
选择many
,因为你之后会再次选择
GroupBy
。它会给我一个分组列表@Yatiac你会一直有Item1和Item2,或者可能还有其他的吗?@CodingYoshi可能还有其他的
var unitsNames = o["Assets"].SelectMany(a => a["Items"]).DistinctBy(i=>i["Name"]).Select(i=>i["Name"].ToString());
var allUnits=o["Assets"].SelectMany(a=>a["Items"]);

var kgs=GetExpandoObject(unitsNames, allUnits,"KGs");
var cartons = GetExpandoObject(unitsNames, allUnits, "Cartons");
var containers = GetExpandoObject(unitsNames, allUnits, "Containers");

List<ExpandoObject> res = new List<ExpandoObject>() 
 { 
  kgs as ExpandoObject,cartons as ExpandoObject,containers as ExpandoObject
 };


string jsonString = JsonConvert.SerializeObject(res);
    private static IDictionary<string, object> GetExpandoObject(IEnumerable<string> unitsNames, IEnumerable<JToken> allUnits, string concept)
    {
        var eo = new ExpandoObject() as IDictionary<string, Object>;
        eo.Add("unit", concept);

        foreach (var u in unitsNames)
        {
            var sum = allUnits.Where(un => un["Name"].ToString() == u).Sum(_ => (int)_[concept]);
            eo.Add(u, sum);
        }

        return eo;
    }
[
 {"unit":"KGs","Item1":343,"Item2":1110},
 {"unit":"Cartons","Item1":1262,"Item2":3032},
 {"unit":"Containers","Item1":4,"Item2":36}
]