2017-07-12 125 views
0

我编写了以下查询来过滤查询。我如何使用linq从另一个列表中过滤一个列表

我用First()这是我之前没注意到的问题,因为Entity2也是一个集合。它只会过滤第一个Id。

query = query.Where(x => filter.Ids.Contains(x.Entity2.Select(y => y.testId).First())); 

请建议我如何使用contains来检查Entity2的所有testId属性?

基本上x.Entity2.Select(Y => y.testId)是ID的列表,我想 检查它们是否在filter.Ids含有或没有。

回答

2

如果我理解正确,filter.Idsx.Entity2.Select(y => y.testId)是两个列表,如果IDS,并且要确保从x.Entity2所有ID也是filter.Ids。在这种情况下,你希望以下内容:

var result = query.Where(x => x.Entity2.Count(y => filter.Ids.Contains(y.testId)) == x.Entity2.Count); 

我们在这里做的是我们数为query每个元素,都在它的ID的数量是Entity2filter.Ids。如果该数字等于Entity2中的Ids总数,那么我们将其包含在结果中。

0

为了您上面的查询,你也可以使用Any()Contains()两个,这将作为 根据你过滤器收集具有ID和ENTITY2二者也集合,因此假设我写了这个,

query = query.Where(x => filter.Where(a=> a.Entity2.Any(y=> a.Ids.Contains(y.testId));

但在您的查询中,您也可以删除First()并且可以使用ToList(),但是如果数据很大,它将丢失OutofMemoryException

相关问题