2017-05-04 115 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

相關問題