2011-10-26 16 views
0

我有这些对象:LINQ查询到两个列表收集之间组数据,填充一个嵌套的对象(VB.Net)

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(中MAKEINFO)和列表( Of ModelInfo)并将ModelInfo中的StockInfo集合到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 = ?} 
+0

请告诉我们你到目前为止得到了什么。 – Steven

回答

0

我最终发现这样做的正确的方式,它不需要循环迭代:

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

如果你实际上是试图修改原来的MakeInfo对象,则应停止与该组的查询。 newList将使每个配对与该组的模型。您可以遍历newList,并且对于每个make,将模型聚合到该品牌的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 

如果您确实需要新实例,只需更改循环以创建新项目而不是修改现有make。

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 
+0

我认为可能有办法做到这一点,而不使用循环,也许我是荒谬的(?)。我发现LINQ的执行速度并不快,仅仅通过一些循环来完成整个任务,并将结果创建为新的集合。话虽如此,我已经使用了代码的第二部分,并得到它的工作。谢谢你的帮助。 – alundy

+0

我找到了一个更好的解决方案 - 我添加了一个新的答案。 – alundy

相关问题