如何通过 Linq 过滤一对多关系的查询

How to Filter a Query On a One to Many Relationship via Linq

我有一个产品和一个零件 Table。这是协会:

Create Table Product
{
   Id int,
   Name nvarchar(max)
}

Create Table Part
{
   Id int,
   Name nvarchar (max),
   ProductID int (foreign key to Product.Id),
   SomeCategoryId int
}

现在,我想要 return 一个产品列表,其中的零件列表仅包含 200 的 SomeCategoryId。

规则:

如何让我的代码更高效?

prods = db.Products.OrderBy(o => o.Name).Select(pr => new ProductViewModel
{
    Id = pr.Id,
    Name = pr.Name,
    Parts = pr.Parts.OrderBy(o => o.Name).Select(prt => new PartViewModel
    {
        Id = prt.Id,
        Name = prt.Name,
        SomeCategoryId = prt.SomeCategoryId
    }).Where(w => w.SomeCategoryId == 200).ToList()
}).ToList();

foreach(var prod in prods)
{
    var isSomeCategory = false;
    foreach (var part in prod.Parts)
    {
        if (part.SomeCategoryId == 200)
        {
            isSomeCategory = !isSomeCategory;
        }
    }

    if (isSomeCategory == false)
    {
        prods.Remove(prod);
    }
}

那...

prods = db.Products.Where(pr => pr.Parts.Any(p => p.SomeCategoryId == 200)).OrderBy(o => o.Name).Select(pr => new ProductViewModel
{
    Id = pr.Id,
    Name = pr.Name,
    Parts = pr.Parts.OrderBy(o => o.Name).Select(prt => new PartViewModel
    {
        Id = prt.Id,
        Name = prt.Name,
        SomeCategoryId = prt.SomeCategoryId
    }).Where(w => w.SomeCategoryId == 200).ToList()
}).ToList();