1

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

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)

似乎它会为两张桌子做,但不超过两张?我错过了什么吗?

4

1 回答 1

5

事情就是这样。DepartmentstoFunctions关系是一对多的。所以当你写的时候,

 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的属性的属性”。 ProcessFunction

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

请注意,如果部门的职能、职能的流程或流程的程序中有任何重叠,那么您可能会在最终结果中得到一些重复的程序。如果这不是您想要的,那么您可以使用该Distinct()方法删除重复项,并且您应该在任何有重叠的地方这样做,但不应该有重复。您可以通过简单地添加Distinct()到查询的末尾来获得相同的结果,但是如果您一路杀掉重复项,您将获得更好的性能。因此,实际上,您的查询可能看起来介于以下查询和上一个查询之间,具体取决于有多少重叠以及您想要多少重复:

 Departments
     .SelectMany(departmentObject => departmentObject.Functions)
     .Distinct()
     .Select(functionObject => functionObject.Process)
     .Distinct()
     .Select(processObject => processObject.Procedure)
     .Distinct();
于 2013-05-03T21:41:23.020 回答