繁体   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