2017-05-04 66 views
0

我有一个产品和一个零件表。这是该协会:如何通过Linq在一对多关系上筛选查询

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 
} 

现在,我想回到产品的列表,零部件只包括200

规则,SomeCategoryId的列表:

  • 如果一个Part.SomeCategoryId <> 200,不包括零件
  • 如果没有Part.SomeCategoryId == 200对应于产品通过Part.Product.Id,删除整个产品。

如何让我的代码更高效?

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); 
    } 
} 
+1

你只需要过滤的产品与最终结果的部分。无论是在内存中还是在数据库中执行此操作效率更高,都是值得您尝试的。 –

回答

2

怎么样......

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(); 
+0

这是soooooooooooooooooooo慢!可能是因为我在零件中完全没有数据? – crackedcornjimmy

+0

如果您移动选择前的位置,它会变得更快吗? – DarkSquirrel42

相关问题