代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

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

  •  1
  • Sonny Boy  · 技术社区  · 14 年前

    希望我能解释这一点,但我正在尝试使用一组特殊而复杂(至少对我来说复杂)的标准,从主列表中获取一个对象列表。

    我有一个名为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 回复  |  直到 14 年前
        1
  •  1
  •   tzaman    14 年前

    这应该做到:

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

    我假设你只需要在 thisIteration .ToList() 最后打电话。

        2
  •  0
  •   bdukes Jon Skeet    14 年前

    我不太清楚你想在这里做什么。但是,您可以将循环体转换为下面的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();