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

MyClassA具有属性:


ID
名称


MyClassB具有属性:


ID
名称
活性
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));

最佳答案

Any将为>0。对于> 1,您可以执行以下操作:

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


或具有更好的短路性(但对于LINQ-to-Objects可能很好,但对于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));

10-07 12:08