LINQ to Objects - Родительские, родительские, дочерние отношения - PullRequest
3 голосов
/ 03 февраля 2010

Я новичок в LINQ, и мне удалось написать несколько простых заявлений. Но сейчас у меня более сложная ситуация, которую я не могу понять.

По сути, я пытаюсь написать оператор LINQ to Objects, в котором отношения являются отношениями прародителя, родителя, потомка. (Вы также можете назвать это отношением Master Detail.)

В коде Legacy приведена упрощенная версия, которую я пытаюсь выполнить.

        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"})))

Однако, это только перечислило всех детей (Покрытия).

Вот результат, который я ищу:

Location
    Item 
       Coverage 
    Item 
       Coverage 
       Coverage 
Location 
    Item 
       Coverage 

Итак, данные сгруппированы по местоположению и пункту.

Еще один способ взглянуть на это - ListView или Report. Где группировка осуществляется по местоположению и пункту.

Пример показан ниже

Location
    Item
        Coverage
    Item
        Coverage
        Coverage
Location
    Item
        Coverage

Это ясно?

1 Ответ

0 голосов
/ 24 августа 2011

Ваш исходный запрос не скомпилировался, когда я его протестировал.Вот версия, которая делает:

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

Это куча вложенных SelectMany & Concat выражений и выдает список из Coverage объектов, подобных этому:

Location
  Item
    Coverage
Location
  Item
    Coverage
  Item
    Coverage

Это то, что вы ищете?

...