2014-02-10 2 views
1

내부 목록의 각 반복을 확인하려는 linq 쿼리를 작성하고 싶습니다. 이런 식으로 - LINQ없이이 기본적으로 루프 중첩 될 것이다 : 이 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, 그래서 내가 foeach 루프가 없어?

답변

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

을 그러나 다시, 나는

+0

확실히 - 예에 불과했습니다. –

1

나는 수업을 볼 수 없으므로 이것이 최선의 추측이다. 또한 LFN 문 내에 반복적으로 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

새로운 클래스 인스턴스마다 반복에 대해 언급 ContextDatabase.GetItem(templateID)의 필요성을 자세히보고 싶은데 - 절대적으로 맞고, 필요하지 않습니다. 죄송합니다. 나는 두 가지 답을 모두 표시 할 수 없습니다. 둘 다 일했습니다. –

관련 문제