Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ查询在两个列表集合之间分组数据,填充嵌套对象(VB.Net)_Vb.net_Linq_List_Collections_Aggregate - Fatal编程技术网

LINQ查询在两个列表集合之间分组数据,填充嵌套对象(VB.Net)

LINQ查询在两个列表集合之间分组数据,填充嵌套对象(VB.Net),vb.net,linq,list,collections,aggregate,Vb.net,Linq,List,Collections,Aggregate,我有这些物品: 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 P

我有这些物品:

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,我需要获取一个MakeInfo列表和一个ModelInfo列表,并将ModelInfo中的StockInfo聚合到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 = ?}

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

我最终找到了这样做的正确方法,它不需要循环迭代:

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

我确信这是可能的。

请向我们展示您到目前为止的成果。我认为可能有一种不使用循环的方法,也许我太可笑了。我发现LINQ的执行速度并不比仅仅通过几个循环完成整个过程并将结果构建到一个新集合快得多。话虽如此,我已经使用了代码的第二部分并使其正常工作。谢谢你的帮助。我找到了一个更好的解决方案——我添加了一个新的答案。
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}}