如何使用 Linq 根据另一个列表过滤列表?

Posted

技术标签:

【中文标题】如何使用 Linq 根据另一个列表过滤列表?【英文标题】:How to filter a list based on another list using Linq? 【发布时间】:2013-09-24 09:34:26 【问题描述】:

我有这两个列表,一个是 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)

请注意,是的,两种列表类型是不同的,但是 listOfAllVenues 有一个 int ID 字段,而 listOfBlockedVenues 有一个 VenueID int 字段,我需要使用这两个

非常感谢

【问题讨论】:

所以你想要listOfAllVenues Except listOfBlockedVenues 中的所有内容? @Corak 是的,但类型不同 @Corak 是的,完全正确:) 类型不同,是的,但是 listOfAllVenues 有一个 int ID 字段,而 listOfBlockedVenues 有一个 VenueID int 字段,我需要使用这两个 啊,不同的类型(为什么?o_O),太糟糕了。所以@wudzik 的回答。 ^_^ Venue 和 BlockedVenue 有共同的基本类型吗? 【参考方案1】:

试试这个:

var filtered = listOfAllVenues
                   .Where(x=>!listOfBlockedVenues.Any(y=>y.VenueId == x.Id));

它会获取ID不在blockedVenues列表中的所有Venues

【讨论】:

简化版:var filtered = listOfAllVenuses.Where(x=&gt;listOfBlockedVenues.All(y=&gt;y.VenueId != x.Id)); @RomanY 感谢您的评论,但我从来没有发现“所有不等于”比“没有任何”更简单,所以我发现这里没有简化:) 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。

以上是关于如何使用 Linq 根据另一个列表过滤列表?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个排序列表创建过滤列表

CSharp使用另一个列表及其嵌套列表过滤带有LINQ查询的列表

如何根据多个条件并使用 linq 从通用列表中删除项目

csharp LINQ过滤器列表由另一个列表组成

使用 Linq 根据条件过滤对象列表

如何使用 linq 检测一个集合字段是不是存在于另一个列表中?