事情就是这样。Departments
toFunctions
关系是一对多的。所以当你写的时候,
Departments
你有一个Department
对象的集合。由于每个Department
对象都有自己的Function
对象集合,因此:
Departments.Select(departmentObject => departmentObject.Functions)
为您提供对象集合的集合Function
。
如果要将所有这些聚合在一起,则必须使用不同的方法,特别是
Departments.SelectMany(departmentObject => departmentObject.Functions)
它说“获取Function
对象集合并将它们变成一个大Function
对象集合”
你想要做的是:
Departments.Select(departmentObject => departmentObject .Functions.Process.Procedure)
但是,这不可能工作,因为您正在向一组Function
对象询问其Process
属性。但是,Function
对象的集合没有Process
属性。Function
对象本身具有属性Process
。所以,你真正想做的是:
Departments
.SelectMany(departmentObject => departmentObject.Functions)
.Select(functionObject => functionObject.Process.Procedure)
这基本上翻译为“获取对象集合的集合Function
并将它们变成一个大的Function
对象集合。然后,获取每个对象Procedure
的属性的属性”。 Process
Function
因此,您在这里应该期待的只是与任何部门相关的任何职能的流程所执行的程序的集合。
请注意,如果部门的职能、职能的流程或流程的程序中有任何重叠,那么您可能会在最终结果中得到一些重复的程序。如果这不是您想要的,那么您可以使用该Distinct()
方法删除重复项,并且您应该在任何有重叠的地方这样做,但不应该有重复。您可以通过简单地添加Distinct()
到查询的末尾来获得相同的结果,但是如果您一路杀掉重复项,您将获得更好的性能。因此,实际上,您的查询可能看起来介于以下查询和上一个查询之间,具体取决于有多少重叠以及您想要多少重复:
Departments
.SelectMany(departmentObject => departmentObject.Functions)
.Distinct()
.Select(functionObject => functionObject.Process)
.Distinct()
.Select(processObject => processObject.Procedure)
.Distinct();