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

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

У меня есть класс 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
}

Ответы [ 2 ]

1 голос
/ 16 июля 2010

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

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

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

0 голосов
/ 16 июля 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...