繁体   English   中英

我对LINQ缺乏了解

[英]My lack of understanding LINQ

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

Departments (k = departmentID)
Functions (k = functionID, fk = departmentID)
Processes (k = processID, fk = functionID)
Procedures (k = procedureID, fk = processID)

因此,当他们想出一些我遇到一些奇怪的问题时,他们都会建立关系。

下面的代码将返回我

Departments.Select(s => s.Functions)

在此处输入图片说明

但是,当尝试进一步扩展该查询时,它不会让我接受。 我希望能够加入上述所有表格,并根据需要从中提取信息。

Departments.Select(s => s.Functions.Process.Procedure) // Errors out

此外,我可以执行以下操作:

Functions.Select(s => s.Processes)

看来它将对两个表执行此操作,但不超过2个? 我想念什么吗?

就是这个 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对象的大集合。然后,获取每个Function对象的Process属性的Procedure属性”。

因此,您应该在这里期望的只是与任何部门相关的任何功能的过程所执行的过程的集合。

请注意,如果部门职能,职能流程或流程过程中存在任何重叠,则最终结果中可能会出现一些重复的过程。 如果这不是您想要的,则可以使用Distinct()方法删除重复项,并且应该在有重叠但没有重复的任何时候这样做。 您只需在查询末尾添加Distinct()就可以得到相同的结果,但是如果您一路杀掉重复项,则性能会更好。 因此,实际上,您的查询可能看起来像在下一个查询与上一个查询之间,具体取决于您有多少重叠和您想要多少重复:

 Departments
     .SelectMany(departmentObject => departmentObject.Functions)
     .Distinct()
     .Select(functionObject => functionObject.Process)
     .Distinct()
     .Select(processObject => processObject.Procedure)
     .Distinct();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM