3

我有两个列表 listA 是一个列表MyClassA和 listBMyClassB

MyClassA具有属性:

  • ID
  • 姓名

MyClassB具有属性:

  • ID
  • 姓名
  • 积极的
  • MyClassAId

一个项目MyClassA可以有一个或多个项目 MyClassB

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

我想得到一个列表,MyClassA其中的项目数MyClassB> active = true1

我试过这样的事情:

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

2 回答 2

3

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));
于 2012-11-22T07:19:21.087 回答
0
var query = (from a in listA let count = listB.Count(b => b.Active && a.Id == b.MyClassAId) where count > 1 select a).ToList();
于 2012-11-22T07:29:19.797 回答