【问题标题】:Is it possible to filter child collections during a Linq.Where()? [duplicate]是否可以在 Linq.Where() 期间过滤子集合? [复制]
【发布时间】:2016-03-22 11:59:33
【问题描述】:

我有一个对象层次结构:

DeathStar.Floors.Departments.Rooms

目前,我只选择包含被机器人恐吓或注入的叛军渣滓房间的部门的楼层:

var rebelScum = deathStar.Floors.Where(
                f=> f.Departments.Any(
                    d => d.Rooms.Any(
                        r => r.Occupant.Allegiance  == "Rebel"
                            && (r.InterrogationState == Interrogation.Intimidation
                                || r.InterrogationState == Interrogation.FloatyStabbyDroid)
                        )
                    )
                );

但是,rebelScum 将包含与任何被审讯的反叛败类在同一部门的空房间。

我可以在这个.Where() 中过滤,只返回被占用的房间吗?

【问题讨论】:

  • 在你检查了叛军的忠诚度之后,你能不能不添加&& r.Rooms.Occupied 或第二个Any() 内的任何东西(哈哈)
  • 搜索“实体框架过滤子集合”。例如。 stackoverflow.com/questions/7079378/…。之前已经回答过很多次了。您将获得所查询内容的确切结果:any 个房间满足其余查询的所有部门。然后部门将包含他们的所有房间,您必须自己过滤。
  • 使用Select() 选择您需要的值怎么样?
  • “但是,rebelScum 将包含空房间” - 不,它只会包含 楼层。您的查询是楼层,而不是房间。如果您只想要房间(或部门),那就另当别论了。
  • @StuperUser:是的,因为您想要将“包括空房间的楼层”投影到“不包括空房间的楼层”。该投影本身包含过滤,但它仍然是一个投影。

标签: c# linq


【解决方案1】:
  IEnumerable<Room> roomsOccupiedByRebelScum = deathStar.Floors.SelectMany(f => f.Departments)
                                                .SelectMany(d => d.Rooms)
                                                .Where(r => r.Occupant != null && r.Occupant.Allegiance == "Rebel" && 
                                                (r.InterrogationState == Interrogation.Intimidation || r.InterrogationState == Interrogation.FloatyStabbyDroid)
                                                );

如果你想过滤房间,它们必须形成查询的结果

【讨论】:

  • 谢谢凯多,我需要有部门的楼层,而且只有被占用的房间。所以,我将不得不做一些Select()s 来过滤并最终得到一个IEnumerable&lt;Floor&gt;
  • 您现在更改了 where 子句,因为房间是结果,我更新了我的答案以包括对 occupant 的空检查(这将是我对“仅占用”的定义)
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多