LINQ to Entities问题 - 子集合中所有项目出现在另一个集合中的所有对象?

时间:2010-07-16 18:37:53

标签: c# .net linq linq-to-entities

希望我能解释一下它有意义的地方,但我正试图从主列表中获取一个对象列表,使用一组特殊的复杂(至少是复杂的)标准。

我有一个名为TableInfo的类,它公开了一个ForeignKeyInfo列表。 ForeignKeyInfo有一个名为Table的字符串属性(以及其他)。我需要使用我的TableInfo对象进行一些顺序处理,但只能处理我尚未处理的TableInfo对象。为了跟踪哪些TableInfo对象已被处理,我有一个List,它在处理完成后存储表的名称。

我想循环,直到我的TableInfo集合中的所有项都出现在我的处理列表中。对于循环的每次迭代,我应该处理所有的TableInfo项,其中所有的ForeignKeyInfo.Table字符串都出现在我处理过的List中。

以下是我用“标准”循环代码编写的方法:

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 个答案:

答案 0 :(得分:1)

这应该这样做:

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

我假设您只需要迭代thisIteration集合,在这种情况下将其保留为IEnumerable就可以了。如果您需要它作为列表,您可以在最后输入.ToList()电话。

答案 1 :(得分:0)

我不确定你在这里要做什么。但是,您可以将循环体转换为以下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();