根据子集合从集合中获取元素

Get element from collection, depending on subcollection

这是我的 class 结构:

Public Class Product
    Dim productRef As string 
    Dim totalStock As Integer
    Dim sizes As List(of ProdSize)
End Class
Public Class ProdSize
    Dim stock As Integer
    Dim size As String
End Class

我在 List (of ProdSize) 中存储了一系列产品。我需要提取股票价值 > 0 的产品。我用以下代码得到了这个:

FinalList = (From p In ProductList Where p.totalStock > 0 Select p).toList()

但现在要求发生了变化,我需要获得 ProdSize 特定尺码且库存 > 0 的产品。

例如:

Prod A, Size M, Stock 1
Prod A, Size S, Stock 0
Prod B, Size M, Stock 0
Prod B, Size S, Stock 1
Prod C, Size M, Stock 1
Prod C, Size S, Stock 1

当我查找尺码 'M' 时,我想在列表 FinalList 中找到产品 A 和 C。

有没有办法通过单个 LINQ 获得此信息? 提前致谢!

编辑

我忘了说我需要使用 class ProdSize 的属性:stocksize

试试这个:-

FinalList = (From p In ProductList Where p.totalStock > 0 
                        AndAlso p.Size = "M" Select p).ToList()

编辑:

您提供的数据似乎与您提供的 类 不匹配,虽然我已经根据您的 类 使用了该示例数据并用 C​​# 编写了这个 (希望你能在VB中将Lambda转换为Function(x)):-

var FinalList = productList
              .SelectMany(x => x.sizes, 
                   (prodObj, Sizes) => new 
                               { prodObj.productRef, Sizes })
              .Where(x => x.Sizes.size == "M" && x.Sizes.stock > 0)
              .Select(x => new
                        {
                            ProductName = x.productRef,
                            Size = x.Sizes.size,
                            Stock = x.Sizes.stock
                         }).ToList();

检查此 Fiddle,获取我使用过的示例数据和查询。

这就是我相信你想要的:

Dim FinalList = (From p In ProductList
                 Where p.sizes.Any(Function(x) x.stock > 0 AndAlso x.size = "M")
                 Select p).ToList()

虽然 "M" 是硬编码的,但我相信您可以想办法在其他地方删除它。

让我知道这是否有效。

结果: