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