[英]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.