获取子列表中包含条件的列表

时间:2012-11-22 07:12:15

标签: c# .net linq

我有两个列表列表是MyClassA的列表和MyClassB的列表B

带有属性的

MyClassA

  • 编号
  • 名称
带有属性的

MyClassB

  • 编号
  • 名称
  • 有效
  • MyClassAId

项目MyClassA可以包含一个或多个项目MyClassB

- MyClassA
    |
    | MyClassB
    | MyClassB
- MyClassA
    |
    | MyClassB
    | MyClassB
    | MyClassB
    | MyClassB

我想获得一个MyClassA列表,其中MyClassBactive = true的数量为> 1

我试过这样的事情:

listA.Where(b => listB.Any(a => a.MyClassAId == b.Id && a.Active == true));

2 个答案:

答案 0 :(得分:2)

Any将是> 0.对于> 1你可以做类似的事情:

listA.Where(a => listB.Count(b => b.MyClassAId == a.Id && b.Active) > 1);

或更好的短路(但对于LINQ到对象,但不是EF等可能很好):

listA.Where(
    a => listB.Where(b => b.MyClassAId == a.Id && b.Active).Skip(1).Any());

另一种方法是预先计算计数:

var include = new HashSet<int>(listB.Where(b => b.Active)
                  .GroupBy(b => b.MyClassAId)
                  .Where(grp => grp.Count() > 1)
                  .Select(grp => grp.Key));

然后:

listA.Where(a => include.Contains(a.Id));

答案 1 :(得分:0)

var query = (from a in listA let count = listB.Count(b => b.Active && a.Id == b.MyClassAId) where count > 1 select a).ToList();