2014-02-10 68 views
1

我想寫一個linq查詢,我想檢查內部列表的每個迭代。如果沒有LINQ,這將基本上是嵌套的for循環 - 就像這樣:如何編寫這個linq內部查詢?

List<Item> selectedList = new List<Item>(); 
      foreach (Item i in item.Children) 
      { 
       var childPages = ((from innerItem in i.Children 
            where innerItem.Template.BaseTemplates.Contains(new TemplateItem(ContextDatabase.GetItem(templateID)), new Compare()) 
            select innerItem).DefaultIfEmpty()); 

       if (childPages.First() == null) 
       { 
        selectedList.AddRange(childPages.ToList()); 
       } 
      } 

我轉換內環到LINQ查詢 - 現在我要轉換的for循環到相同的 - 有寫方式這在linq中,這樣我就不必有這個循環了嗎?

回答

1

它看起來像你」在每次迭代中從數據庫中獲取項目以便進行比較......是您絕對需要的嗎?應該有一種更簡單的方法來進行基於id的比較(但需要更多的信息,我認爲你)。

無論如何,除去外foreach,你可以做的另一種from條款:

var childPages = (from i in item.Children 
       from innerItem in i.Children 
       where innerItem.Template.BaseTemplates.Contains(new TemplateItem(ContextDatabase.GetItem(templateID)), new Compare()) 
       select innerItem).DefaultIfEmpty(); 

但同樣,我會在需要仔細尋找ContextDatabase.GetItem(templateID)

+0

絕對 - 只是爲了這個例子.. –

1

我看不到你的課,所以這是一個最好的猜測。另外,我假設您不必在LINQ語句中重複創建新實例TemplateItemCompare

var templateItem = new TemplateItem(ContextDatabase.GetItem(templateID)); 
var comparer = new Compare(); 

selectedList.AddRange(item.Children.SelectMany(
    x => x.Children.Where(y => y.Template.BaseTemplates.Contains(templateItem, comparer)))); 

(我在這裏使用的方法來調用,而不是查詢語法,因爲這就是我比較熟悉的,結果應該是一樣的。)

+1

注意到有關新的類實例每次迭代 - 絕對正確,不需要(只是爲了舉例)。對不起,我不能標出兩個答案 - 他們都工作。 –