Вопрос LINQ to Entities. Все объекты, в которых все элементы подколлекции отображаются в другой коллекции?

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

У меня есть класс TableInfo, который предоставляет список ForeignKeyInfo. ForeignKeyInfo имеет строковое свойство (среди прочего), называемое Table. Мне нужно выполнить некоторую последовательную обработку с использованием моих объектов TableInfo, но работать только с объектами TableInfo, которые я еще не обработал. Чтобы отслеживать, какие объекты TableInfo уже были обработаны, у меня есть список, в котором сохраняется имя таблицы после завершения обработки.

Я хочу зацикливаться, пока все элементы моей коллекции TableInfo не появятся в моем обработанном списке. Для каждой итерации цикла я должен обрабатывать все элементы TableInfo, где все строки ForeignKeyInfo.Table появляются в моем обработанном списке.

Вот как я написал это в «стандартном» циклическом коде:

while(processed.Count != _tables.Count)
{
     List<TableInfo> thisIteration = new List<TableInfo>();

     foreach (TableInfo tab in _tables)
     {
          bool allFound = true;
          foreach (ForeignKeyInfo fk in tab.ForeignKeys)
          {
               allFound = allFound && processed.Contains(fk.Table);
          }

          if (allFound && !processed.Contains(tab.Name))
          {
               thisIteration.Add(tab);
          }
     }

     //now do processing using thisIteration list
     //variable, "thisIteration", is what I'd like to replace with the result from LINQ
}

person Sonny Boy    schedule 16.07.2010    source источник


Ответы (2)


Это должно сделать это:

var thisIteration = _tables.Where(t => !processed.Contains(t.Name)
                                    && t.ForeignKeys
                                        .All(fk => processed.Contains(fk.Table));

Я предполагаю, что вам просто нужно перебрать коллекцию thisIteration, и в этом случае можно оставить ее как IEnumerable. Если вам нужно, чтобы это был список, вы можете просто вставить вызов .ToList() в конце.

person tzaman    schedule 16.07.2010

Я не совсем понимаю, что вы пытаетесь здесь сделать. Однако вы можете преобразовать тело цикла в следующий запрос LINQ, если это упростит задачу...

List<TableInfo> thisIteration = (from tab in _tables
                                 let allFound = tab.ForeignKeys.Aggregate(true, (current, fk) => current && processed.Contains(fk.Table))
                                 where allFound && !processed.Contains(tab.Name)
                                 select tab).ToList();
person bdukes    schedule 16.07.2010