如何使用Linq根据另一个列表筛选列表?

61

我有两个列表,一个是Venue对象的列表,另一个是BlockedVenues对象的列表。

我需要过滤listOfAllVenues中的每个条目,以便不包含任何被阻止的场馆。

     IQueryable<Venue> listOfAllVenues = MyDB.Venues;
     IQueryable<BlockedVenue> listOfBlockedVenues = Mydb.BlockedVenue;
     //I need something to accomplish this please
     // var listOfAllVenues_WithoutBlocked_Venues = 
                           ( Select All venues from listOfAllVenues
                             where listOfAllVenues.ID is NOT in
                             listOfBlockedVenues.VenueID)
请注意,listOfAllVenueslistOfBlockedVenues 两种列表类型不同,但 listOfAllVenues 具有 int ID 字段,而 listOfBlockedVenues 具有 VenueID int 字段,我需要使用这两个字段。

非常感谢。


1
所以你想要从listOfAllVenues中获取除了listOfBlockedVenues中的所有场馆? - Corak
1
@Corak 是的,但类型不同。 - Kamil Budziewski
@Corak 是的,完全正确 :) 类型是不同的,但是listOfAllVenues有一个int ID字段,而listOfBlockedVenues有一个VenueID int字段,我需要使用这两个。 - iAteABug_And_iLiked_it
啊,不同的类型(为什么?o_O),太糟糕了。所以@wudzik的答案。^_^ - Corak
场馆和被屏蔽的场馆有共同的基础类型吗? - Jean Hominal
2个回答

119

试试这个:

var filtered = listOfAllVenues
                   .Where(x=>!listOfBlockedVenues.Any(y=>y.VenueId == x.Id));
它将获取所有场馆,其中ID不在blockedVenues列表中。

8
var filtered = listOfAllVenuses.Where(x=>listOfBlockedVenues.All(y=>y.VenueId != x.Id));这行代码的意思是从 listOfAllVenuses 列表中筛选出那些在 listOfBlockedVenues 列表中没有被屏蔽的场馆。 - Roman Y
2
@RomanY 感谢您的评论,但我从未发现“all not equal”比“not any”更简单,所以我在这里没有找到任何简化 :) - Kamil Budziewski
指定的LINQ表达式包含与不同上下文相关联的查询引用。 - Henjin

3

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