LINQ-запрос для группировки данных между двумя коллекциями списков с заполнением вложенного объекта (VB.Net) - PullRequest
0 голосов
/ 26 октября 2011

У меня есть следующие объекты:

Public Class MakeInfo
  Public Property Name As String
  Public Property Description As String
  Public Property Stock As StockInfo
End Class

Public Class ModelInfo
  Public Property Make As String
  Public Property Name As String
  Public Property Description As String
  Public Property Stock As StockInfo
End Class

Public Class StockInfo
  Public Property Count As Integer
  Public Property MinPrice As Double
End Class

Используя LINQ, мне нужно взять List (Of MakeInfo) и List (Of ModelInfo) и объединить StockInfo из ModelInfo в List (Of MakeInfo).

Таким образом, для каждого MakeInfo у меня будет общее количество всех акций, где MakeInfo.Name = ModelInfo.Make, а также минимальная цена.

Я думаю, что это будет примерно так, но у меня проблемы с доступом к вложенному объекту, и я не уверен, что это возможно с помощью одного запроса. Я попробовал несколько вариантов, но вот где я до:

newList = From ma In makeData _
          Group Join mo In modelData _
          On ma.Name Equals mo.Make _
          Into Group _
          Select New MakeInfo With {.Name = m.Name, _
                                    .Description = m.Description, _
                                    .Stock = ?}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

В конце концов я нашел правильный способ сделать это, и он не требует итерации цикла:

Dim new_makes = From ma In makes
                Join mo In models On mo.Make Equals ma.Name
                Group By ma.Name, ma.Description
                Into TotalCount = Sum(mo.Stock.Count), LowestPrice = Min(mo.Stock.MinPrice)
                Select New MakeInfo With {.Name = Name, _
                                          .Description = Description, _
                                          .Stock = New StockInfo With {.Count = TotalCount, .MinPrice = LowestPrice}}

Я был уверен, что это будет возможно.

0 голосов
/ 26 октября 2011

Если вы на самом деле пытаетесь изменить исходные объекты MakeInfo, вам следует остановить запрос с группой.newList будет иметь каждую марку в паре с группой моделей этой марки.Вы можете перебирать newList и для каждой марки агрегировать модели в StockInfo для марки.

Dim newList = From ma In makeData _
              Group Join mo In modelData _
              On ma.Name Equals mo.Make _
              Into Group
For Each g In newList
    g.ma.Stock = g.Group.Aggregate(
                    New StockInfo() With {.MinPrice = Double.NaN},
                    Function(si, model)
                        Return New StockInfo With {
                                     .Count = si.Count + 1,
                                     .MinPrice = If(Double.IsNaN(si.MinPrice) OrElse
                                                    model.Stock.MinPrice < si.MinPrice,
                                                    model.Stock.MinPrice,
                                                    si.MinPrice)}
                    End Function)
Next

Если вы действительно хотите новые экземпляры, просто измените цикл для создания нового элемента вместоизменение существующей марки.

Dim results As New List(Of MakeInfo)()
For Each g In newList
    Dim newMake As New MakeInfo()
    newMake.Name = g.ma.Name
    newMake.Description = g.ma.Description
    newMake.Stock = g.Group.Aggregate( same as before )
    results.Add(newMake)
Next
...