簡體   English   中英

如何編寫此linq內部查詢?

[英]How do I write this linq inner query?

我想編寫一個linq查詢,其中要檢查內部列表的每次迭代。 沒有linq,這基本上是嵌套的for循環-像這樣:

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中編寫此代碼,這樣就不必使用foeach循環了?

我看不到您的課程,所以這是最好的猜測。 另外,我假設您不必在LINQ語句中創建TemplateItem的新實例並重復Compare

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))));

(我在這里使用方法語法而不是查詢語法,因為這是我更熟悉的方法。結果應該是相同的。)

看起來您每次迭代都從數據庫中獲取一個項目以便進行比較...這是您絕對需要的嗎? 應該有一種更簡單的方法來根據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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM