如何使用LINQ从嵌套列表中返回Room类型的列表?
实现GetRoomForRabbitOwners方法筛选符合条件的Room列表
需求明确:实现API端点方法GetRoomForRabbitOwners,返回所有未饲养Cat或Owl的Room列表——只要房间内存在任意一只禁养宠物(Cat/Owl),就不能纳入结果。此前的错误实现返回了Tenant类型列表,现在必须确保返回Room类型集合。
完整实现代码
假设你有一个获取所有房间的异步数据源(比如仓储接口IRoomRepository),以下是正确的方法实现:
public async Task<List<Room>> GetRoomForRabbitOwners() { // 替换为你项目中实际的房间数据查询逻辑(需关联加载Residents) var allRooms = await _roomRepository.GetAllAsync(); // 筛选符合条件的房间:排除所有包含Cat或Owl的房间 var eligibleRooms = allRooms .Where(room => !room.Residents.Any(resident => resident.PetType == PetType.Cat || resident.PetType == PetType.Owl)) .ToList(); return eligibleRooms; }
逻辑说明
- 数据源获取:首先异步获取系统中所有Room的完整列表,若使用EF Core,可写成
await _dbContext.Rooms.Include(r => r.Residents).ToListAsync(),确保关联加载居民数据。 - 筛选条件:
- 对每个房间,检查其所有居民(Residents)中是否存在PetType为
Cat或Owl的情况 - 用
!取反,只保留没有任何禁养宠物的房间 - 空房间(Residents为空集合)会自动符合条件,因为
Any在空集合时返回false,取反后为true
- 对每个房间,检查其所有居民(Residents)中是否存在PetType为
示例数据验证
根据你提供的JSON示例数据:
- Room id=1:存在居民Nicol(petType=3,对应Owl),会被排除
- Room id=2:居民Rambo的petType=2(Rabbit),符合条件,会被保留
- Room id=3、4、5:无居民,符合条件,会被保留
最终返回的Room列表包含id=2、3、4、5的房间。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

