我的理解不足的LINQ(My lack of understanding LINQ)

2019-10-18 02:25发布

好吧,我有几个表连接在一起。

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? 我缺少的东西吗?

Answer 1:

事情是这样的。 该DepartmentsFunctions关系是一对多的。 所以,当你只是写,

 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();


文章来源: My lack of understanding LINQ
标签: c# linq lambda