【问题标题】:LINQ to Objects - Grandparent, Parent, Child RelationshipLINQ to Objects - 祖父母、父母、子女关系
【发布时间】:2011-01-12 16:25:19
【问题描述】:

我是 LINQ 的新手,我已经能够编写一些简单的语句。但是现在我有一个更复杂的情况,我无法弄清楚。

基本上,我正在尝试编写一个 LINQ to Objects 语句,其中关系是祖父母、父母、孩子的关系。 (您也可以将其称为主从关系。)

在旧代码中,这是我想要完成的简化版本。

        Dim coverages As New List(Of Coverage)
        Dim coverage As Coverage 

        For Each rl In oClaimsPolicy.RiskLocations 

            coverage = New Coverage
            coverage.Level = "Location"

            'Get rl detail detail
            coverages.Add(coverage) 

            For Each ri In rl.RiskItems 

                coverage = New Coverage
                coverage.Level = "Item"

                'Get ri detail
                coverages.Add(coverage) 

                For Each rc In ri.RiskCoverages 

                    coverage = New Coverage
                    coverage.Level = "Coverage"

                    'Get rc detail here
                    coverages.Add(coverage) 

                Next 

            Next 

        Next

如果不清楚,一个Location 可以有多个Items,一个Item 可以有多个Coverages。我基本上想列出项目并显示祖父母(位置)、父母(项目)和孩子(覆盖)之间的关系。

更新:

这是我想出的:

Dim coverages = oClaimsPolicy.RiskLocations. _
                  SelectMany(Function(rl) rl.RiskItems. _
                  SelectMany(Function(ri) ri.RiskCoverages. _
                  Select(Function(rc) New Coverage With {.Level = "Coverage"})))

但是,这只是列出了所有孩子(Coverages)。

这是我正在寻找的结果:

Location
    Item 
       Coverage 
    Item 
       Coverage 
       Coverage 
Location 
    Item 
       Coverage 

因此,数据按位置和项目分组。

查看它的另一种方式是 ListView 或 Report。分组是按位置和项目完成的。

一个例子如下所示

Location
    Item
        Coverage
    Item
        Coverage
        Coverage
Location
    Item
        Coverage

这清楚吗?

【问题讨论】:

  • 到目前为止您尝试了什么,请发布代码。以及它如何没有满足您的要求(显示所需的和实际的输出)。
  • Lazarus,我根据您的要求更新了条目。谢谢

标签: vb.net linq linq-to-objects


【解决方案1】:

当我去测试你的原始查询时,它没有编译。这是一个版本:

Dim coverages = _
    From rl In oClaimsPolicy.RiskLocations _
    From ri in rl.RiskItems _
    From rc in ri.RiskCoverages _
    Select New Coverage With {.Level = "Coverage"}

现在,要获得您想要的结果,请尝试这样做:

dim create As Func(Of String, IEnumerable(Of Coverage)) = _
    Function (level) New Coverage() _
        { New Coverage With { .Level = level } }

Dim coverages = _
    From rl In oClaimsPolicy.RiskLocations _
    From cl In create("Location").Concat( _
            From ri In rl.RiskItems _
            From ci In create("  Item").Concat( _
                    From rc In ri.RiskCoverages _
                    From cc In create("    Coverage") _
                    Select cc) _
            Select ci) _
    Select cl

这是一组嵌套的 SelectManyConcat 表达式,它会生成一个 Coverage 对象列表,如下所示:

Location
  Item
    Coverage
Location
  Item
    Coverage
  Item
    Coverage

这就是你所追求的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多