好吧,我有几个表连接在一起。
Departments (k = departmentID)
Functions (k = functionID, fk = departmentID)
Processes (k = processID, fk = functionID)
Procedures (k = procedureID, fk = processID)
因此,他们都在努力想出一些LINQ我碰到一些古怪的时候有他们的关系设置。
下面的代码将返回我
Departments.Select(s => s.Functions)
但是,试图展开查询时进一步它不会让我。 我希望能够加入上述所有表格和拉出来的信息他们,因为我需要它。
Departments.Select(s => s.Functions.Process.Procedure) // Errors out
进一步,我可以做到以下几点:
Functions.Select(s => s.Processes)
看来它会做两个表,但不超过2? 我缺少的东西吗?
事情是这样的。 该Departments
对Functions
关系是一对多的。 所以,当你只是写,
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();