2014-02-10 4 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 - теперь я хочу, чтобы преобразовать цикл в то же самое - есть способ, чтобы написать это в linq, так что мне не нужно иметь петлю foeach?

ответ

1

Это выглядит, как вы» re получение элемента из базы данных на каждой итерации, чтобы сделать сравнение ... это то, что вы абсолютно требуете? Должен быть более простой способ делать сравнения, основанные только на 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)

+0

Определенно - был только для примера .. –

1

Я не вижу ваших классов, поэтому это лучшее предположение. Кроме того, я предполагаю, что вам не нужно повторно создавать новый экземпляр TemplateItem и Compare внутри оператора LINQ.

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

отметил о новом классе экземпляра каждой итерации - абсолютно правильно, не нужно (это было только для примера). Извините, я не могу отметить оба ответа - они оба работали. –

Смежные вопросы