C# 复杂linq语句-嵌套组/where/sum/select

C# 复杂linq语句-嵌套组/where/sum/select,c#,linq,C#,Linq,我有一个对象,例如下面的示例 object = { [0] {Name: "Foo", Customer: "Alex", Number: "33.2", Amt: 100.50, FileId: 12345611, FileNumber: "0987-123"} [1] {Name: "Bar", Customer: "Josh" Number: "1", Amt: 100.50, FileId: 456546456, FileNumber: "0987-123

我有一个对象,例如下面的示例

object = {
        [0] {Name: "Foo", Customer: "Alex", Number: "33.2", Amt: 100.50, FileId: 12345611, FileNumber: "0987-123"}
        [1] {Name: "Bar", Customer: "Josh" Number: "1", Amt: 100.50, FileId: 456546456, FileNumber: "0987-123"}
        [2] {Name: "Foo", Customer: "Alex", Number: "33.2", Amt: 110.00, FileId: 12345611, FileNumber: "0987-123"}
        [3] {Name: "Foo", Customer: "Frank", Number: "9.8", Amt: 100.50, FileId: 324234, FileNumber: "9999-123"}
        [4] {Name: "Test2", Customer: "Bob" , Number: "1.9", Amt: 100.50, FileId: 782724, FileNumber: "0987-123"}
        [5] {Name: "Foo", Customer: "Alex" , Number: "33.2", Amt: 50.80, FileId: 9872561, FileNumber: "8181-1273"}
    }
我需要它看起来像下面

groupedObject = {
        [0] {Name: "Foo", 
                Rows: {
                        row: {
                            [0] {Number: "33.2", Customer: "Alex", Details: {
                                        [0] {Amt: 210.50, Number: "33.2", FileId: 12345611, FileNumber: "0987-123"}
                                        [0] {Amt: 50.80, Number: "33.2", FileId: 9872561, FileNumber: "8181-1273"}
                                    }
                                }
                            [1] {Number: "9.8", Customer: "Frank", Details: {
                                        [0] {Amt: 100.50, Number: "9.8", FileId: 324234, FileNumber: "9999-123"}
                                    }
                                }
                        }
                    }
            }
        [1] {Name: "Bar", 
                Rows: {
                        row: {
                            [0] {Number: "33.2", Customer: "Josh", Details: {
                                        [0] {Amt: 100.50, Number: "1", FileId: 456546456, FileNumber: "0987-123"}
                                    }
                                }
                        }
                    }
            }
        [2] {Name: "Test2", 
                Rows: {
                        row: {
                            [0] {Number: "1.9", Customer: "Bob", Details: {
                                        [0] {Amt: 100.50, Number: "1.9", FileId: 782724, FileNumber: "0987-123"}
                                    }
                                }
                        }
                    }
            }
    }   
我试图实现的是按名称分组,然后在名称中按客户分组,然后在该客户中按客户详细信息分组,具有相同文件ID的详细信息需要合并行。这对linq有可能吗

如果它有助于可视化,下面是我所需要的,但在XML中

<main>
    <UniqueNames>
        <randominfo>true</randominfo>
        <randominfo2>false</randominfo2>
        <head>
            <Name>Foo</Name>
        </head>
        <rows>
            <row>
                <Number>"33.2"</Number>
                <Customer>"Alex"</Customer>
                <Details>
                    <Detail>
                        <Amt>210.50</Amt>
                        <Number>"33.2"</Number>
                        <FileId>12345611</FileId>
                        <FileNumber>"0987-123"</FileNumber>
                    </Detail>
                    <Detail>
                        <Amt>50.80</Amt>
                        <Number>"33.2"</Number>
                        <FileId>9872561</FileId>
                        <FileNumber>"8181-1273"</FileNumber>
                    </Detail>
                </Details>
            </row>
        </rows>
    </UniqueNames>
    <UniqueNames>
        <randominfo>true</randominfo>
        <randominfo2>false</randominfo2>
        <head>
            <Name>Bar</Name>
        </head>
        <rows>
            <row>
                <Number>"33.2"</Number>
                <Customer>"Josh"</Customer>
                <Details>
                    <Detail>
                        <Amt>100.50</Amt>
                        <Number>"1"</Number>
                        <FileId>456546456</FileId>
                        <FileNumber>"0987-123"</FileNumber>
                    </Detail>
                </Details>
            </row>
        </rows>
    </UniqueNames>
    <UniqueNames>
        <randominfo>true</randominfo>
        <randominfo2>false</randominfo2>
        <head>
            <Name>Test2</Name>
        </head>
        <rows>
            <row>
                <Number>"1.9"</Number>
                <Customer>"Bob"</Customer>
                <Details>
                    <Detail>
                        <Amt>100.50</Amt>
                        <Number>"1.9"</Number>
                        <FileId>782724</FileId>
                        <FileNumber>"0987-123"</FileNumber>
                    </Detail>
                </Details>
            </row>
        </rows>
    </UniqueNames>
</main>
然后我还有另一个可以得到所有细节的

var Details =
                (from c in TestObject
                    group c by new
                    {
                        c.Number,
                        c.FileId,
                        c.FileNumber,
                    } into cFIDs
                    select new FileAllocation()
                    {

                        FileAmount = cFIDs.Sum(s => s.Amt),
                        Number = cFIDs.Key.Number,
                        FileId = cFIDs.Key.FileId,
                        FileNumber = cFIDs.Key.FileNumber,
                    }).ToList();
上面允许我分组并生成所需的详细信息,第一个按名称分组并列出每个组的行。。。我也试过下面的方法


我只是不知道如何把它们放在一起,你需要3个单独的
GroupBy
语句,然后将每个语句投影到输出的正确属性。有几种方法可以实现,但最容易阅读的可能是:

var result = inputs.GroupBy(x => x.Name)
        .Select(g => new {
            Name = g.Key,
            Rows = g.GroupBy(x => new {x.Customer, x.Number})
                .Select(g2 => new{
                    Number = g2.Key.Number,
                    Customer = g2.Key.Customer,
                    Details = g2.GroupBy(x => new {x.FileId,x.FileNumber})
                                .Select(g3 => new {Amt = g3.Sum(x => x.Amt), g2.Key.Number, g3.Key.FileId, g3.Key.FileNumber})

                })
        });
下面是一个使用您的数据的实时工作示例:

以上使用匿名对象,如果您愿意,您可以轻松地投影到自定义对象。最后一个投影可以是:

...
.Select(g3 => new FileAllocation{Amt = g3.Sum(x => x.Amt), g2.Key.Number, g3.Key.FileId, g3.Key.FileNumber})
...

GroupBy将是你在这种情况下的朋友。到目前为止,你做了哪些尝试?这个网站不应该是一个编码服务,而是一个当你自己尝试了一些东西但它不起作用时可以得到帮助的网站。请向我们提供您尝试的代码,以及关于如何以及为什么不适用于您的信息。
使用linq是否可以做到这一点?
确实可以。如前所述,
到目前为止您尝试了什么
,当我们知道您尝试了什么以及您遇到了什么问题时,我们将很乐意提供帮助。只需用我尝试过的一些东西更新我的问题谢谢!这很有用。这并不完全是我所需要的,但从你给我的东西中,我能够改变它,看到它的功能,并从那里开始!我现在已经按我想要的方式工作了。谢谢你!很高兴这有帮助。对不正确的东西感兴趣,因为它正是你所描述的正确的,它正是我所描述的。也许我的评论用词不对。就我所解释的而言,这正是我所需要的。你的解释让我可以在上面加上我原来的帖子中没有包含的实际数据,因为我对这一部分没有任何问题。一切都好!谢谢
...
.Select(g3 => new FileAllocation{Amt = g3.Sum(x => x.Amt), g2.Key.Number, g3.Key.FileId, g3.Key.FileNumber})
...