C# 获取子列表上带有条件的列表

C# 获取子列表上带有条件的列表,c#,.net,linq,C#,.net,Linq,我有两个列表listA是MyClassA的列表,listB是MyClassB MyClassA具有以下属性: 身份证 名字 MyClassB带属性: 身份证 名字 活跃的 我的助学金 项目MyClassA可以有一个或多个项目MyClassB - MyClassA | | MyClassB | MyClassB - MyClassA | | MyClassB | MyClassB | MyClassB | MyClassB

我有两个列表listA是
MyClassA
的列表,listB是
MyClassB

MyClassA
具有以下属性:

  • 身份证
  • 名字
MyClassB
带属性:

  • 身份证
  • 名字
  • 活跃的
  • 我的助学金
项目
MyClassA
可以有一个或多个项目MyClassB

- MyClassA
    |
    | MyClassB
    | MyClassB
- MyClassA
    |
    | MyClassB
    | MyClassB
    | MyClassB
    | MyClassB
我想得到一个
MyClassA
列表,其中
MyClassB
with
active=true
的项目数>1

我试过这样的方法:

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

任何
都将>0。对于>1,您可以执行以下操作:

listA.Where(a => listB.Count(b => b.MyClassAId == a.Id && b.Active) > 1);
或具有更好的短路(但可能适用于LINQ到对象,但不适用于EF等):

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

var include = new HashSet<int>(listB.Where(b => b.Active)
                  .GroupBy(b => b.MyClassAId)
                  .Where(grp => grp.Count() > 1)
                  .Select(grp => grp.Key));
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));
var query = (from a in listA let count = listB.Count(b => b.Active && a.Id == b.MyClassAId) where count > 1 select a).ToList();