获取带有子列表条件的列表 [英] Get list with condition on sub list

查看:48
本文介绍了获取带有子列表条件的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have two list listA is a list of MyClassA and listB of MyClassB

MyClassA具有属性:

  • 编号
  • 名称

MyClassB具有以下属性:

  • 编号
  • 名称
  • 活动
  • MyClassAId

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

An item MyClassA can have one or more item MyClassB

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

我想获取MyClassA的列表,其中MyClassBactive = true的项数> 1

I'd like get a list of MyClassA where the number of items MyClassB with active = true is > 1

我尝试过这样的事情:

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

推荐答案

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

Any will be > 0. For > 1 you could do something like:

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

或具有更好的短路性(但对于LINQ-to-Objects可能很好,但对于EF则不行)

or with better short-circuiting (but probabably fine for LINQ-to-Objects, but not EF etc):

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

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

Another approach would be to pre-compute the counts:

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));

这篇关于获取带有子列表条件的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆