我该如何编写这个linq内部查询?

时间:2014-02-10 02:08:43

标签: c# asp.net linq

我想写一个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循环?

2 个答案:

答案 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 :(得分: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)

的必要性