Linq查询列表包含一个列表

48

我有两个类:

public class ObjectA
{
    public int Id;
    public string Name;
}

public class ObjectB
{
    public int Id;
    public string Name;
    public List<ObjectA> ListOfObjectA;
}
所以我有两个列表:一个是ObjectB的列表(ListObjectB),另一个包含ObjectA的id列表(ListOfIdsA)。如果我想要获取ObjectB列表,其中ObjectB.ListOfObjectA在ListOfIdsA中,则需要这样做。
我的第一个(错误的)尝试是:
ListObjectB.Where(p=> ListOfIdsA.Contains(p.ListOfObjectA.Select(b=>b.Id)))

但是这显然会抛出一个异常。我谷歌了一下,在stackoverflow上搜索了一下,但我觉得我的搜索技巧并不好,有人能给出忍者式的答案吗?(最好用lambda表达式)

1个回答

93

您是想获取一个ObjectB列表,其中所有的ObjectA都在ListOfIdsA中,还是只要其中任意一个?

我认为您需要以下之一:

ListObjectB.Where(p => p.ListOfObjectA.Any(x => ListOfIdsA.Contains(x.Id)))
或者
ListObjectB.Where(p => p.ListOfObjectA.All(x => ListOfIdsA.Contains(x.Id)))

如果ListOfIdsA的大小相当大,那么你可能希望将其变成HashSet<string>


3
@Justin:嗯,Where、All 和 Any 都是扩展方法 :) - Jon Skeet
@Justin:啊,那确实更有意义 :) - Jon Skeet
1
@JonSkeet 这可能需要一个单独的问题,但如果我想要在ListOfIdsA中找到所有ObjectA的ID怎么办?我尝试了"All",但似乎这个过滤器基本上没有被应用。 - B Z
1
@BZ:这已经是查询正在执行的操作了。我认为另一个问题(带有简短但完整的示例)可能会很有用。 - Jon Skeet
1
@SharifYazdian:一个使用All,另一个使用Any。但是除非您实际需要将结果具体化,否则没有必要使用ToList() - Jon Skeet
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接