2013-06-27 21 views
0

我想從實體框架實體過濾列表中的列表。該代碼可以轉換爲單個linq語句嗎?

我設法讓代碼正常工作,但我不相信這是達到目標的最簡潔的方式。

這裏是我到目前爲止的代碼:

 foreach (var n1 in tier.MatchNodes) 
     { 
      n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList(); 
     } 

有效MatchNodes包含LenderMatchNodes的集合,但是我只想返回節點,其中佣金== 0

在此先感謝。

+1

LINQ應該沒有突變,所以沒有LINQ。這個代碼是恕我直言*非常*乾淨,因爲它是立即明白這裏發生了什麼。我會離開它。儘管如此,在你的處理過程中儘早整合過濾是值得的。 – Jon

+0

我不認爲_filtering_是相關實體的列表作爲突變... –

+1

@DStanley:代碼正在改變'MatchNodes'。 – Jon

回答

0

嘗試()

tier.MatchNodes.ToList().ForEach(n1=>n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList()); 
+0

那麼,Techincally它是一條線,但我想_intent_是爲了避免n + 1 probelem(不加載相關實體一個接一個) –

0

嘗試使用的SelectMany:

var result = dataContext.Table<Tier>() 
    .Where(some condition to get you the tier) 
    .SelectMany(tier => tier.MatchNodes) 
    .SelectMany(node => node.LenderMatchNodes) 
    .Where(x => x.Commission == 0) 
    .ToList(); 

這具有能夠執行一個單一SQL查詢的額外好處。

如果你的目標是實際更新數據庫中的節點列表,你還可以最大限度地減少查詢使用include()的數量(假設你使用EF):

var nodes = dataContext.Table<Tier>() 
     .Where(some condition to get you the tier) 
     .SelectMany(tier => tier.MatchNodes) 
     .Include(node => node.LenderMatchNodes) // loads this eagerly 
     .ToList(); 
nodes.ForEach(n => n.LenderMatchNodes = n.LenderMatchNodes.Where(condition));