Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 麻烦的LINQ查询/连接_C#_Linq_Linq To Entities - Fatal编程技术网

C# 麻烦的LINQ查询/连接

C# 麻烦的LINQ查询/连接,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,好吧,我甚至不知道从哪里开始。我有四张主桌 IPACS\u部门(一对多)->IPACS\u功能(一对多)->IPACS\u流程(一对多)->IPACS\u程序 我有一个IPACS\u Documents表,其中包含docID的主键 我有4张查表 IPACS\u部门文档->IPACS\u功能文档->IPACS\u流程文档->IPACS\u流程文档 这些表格中的每一个都有一个FK到IPACS\u文档表格docID 它们对我在部门ID、函数ID、进程ID、过程ID中提到的前四个表也有一个FK 我需要通

好吧,我甚至不知道从哪里开始。我有四张主桌

IPACS\u部门
(一对多)->
IPACS\u功能
(一对多)->
IPACS\u流程
(一对多)->
IPACS\u程序

我有一个
IPACS\u Documents
表,其中包含
docID
的主键

我有4张查表

IPACS\u部门文档
->
IPACS\u功能文档
->
IPACS\u流程文档
->
IPACS\u流程文档

这些表格中的每一个都有一个
FK
IPACS\u文档
表格
docID
它们对我在
部门ID
函数ID
进程ID
过程ID
中提到的前四个表也有一个
FK

我需要通过LINQ声明将这些连接在一起

我的部门查看页面。我需要显示当前部门中的每个文档

例如,我们有一个计算机部门。该部门内有2个职能,这些职能内有13个流程,这些流程内有41个程序

因此,在我的部门视图页面上,我需要显示该部门的所有文档及其功能、流程和程序

在我的部门视图页面上,我可以访问
部门ID

我100%困惑的是,如何使用这9个不同的表获取所有相关文档


我希望这是有意义的,因为我的大脑是一个朋友,我不确定你的模型是否正确,但我认为它遵循了这个模式(假设实体框架,后代实体具有映射属性,允许继承人继承):

这简化为:

public List<Document> GetDocumentsForDepartment2(List<Department> departments)
{
  var docs = new List<Document>();

  foreach (var department in departments)
  {
    docs.AddRange(department.DepartmentDocuments.Select(ddoc => ddoc.Document));
    docs.AddRange(department.Functions.SelectMany(fx => fx.FunctionDocuments, (fx, fdoc) => fdoc.Document));
  }

  return docs;
} 
public List getdocumentsforderpartment2(列出部门)
{
var docs=新列表();
foreach(部门中的var部门)
{
docs.AddRange(department.DepartmentDocuments.Select(ddoc=>ddoc.Document));
docs.AddRange(department.Functions.SelectMany(fx=>fx.FunctionDocuments,(fx,fdoc)=>fdoc.Document));
}
退货单据;
} 
这可能没问题,该方案使用多个DB调用(如果您使用的是EF而不是Linq to对象)。如果这很糟糕,那么也许你需要在数据库中放一个视图

我不知道如何将其编写为单个linq查询,所以这可能只是进一步工作的起点


这是一个相当简单的后续行动,你的想法。当您希望聚合子数据时,您需要
SelectMany()

我不确定您的模型是否正确,但我认为它遵循此模式(假设实体框架,子实体具有映射属性,以允许继承人身份):

这简化为:

public List<Document> GetDocumentsForDepartment2(List<Department> departments)
{
  var docs = new List<Document>();

  foreach (var department in departments)
  {
    docs.AddRange(department.DepartmentDocuments.Select(ddoc => ddoc.Document));
    docs.AddRange(department.Functions.SelectMany(fx => fx.FunctionDocuments, (fx, fdoc) => fdoc.Document));
  }

  return docs;
} 
public List getdocumentsforderpartment2(列出部门)
{
var docs=新列表();
foreach(部门中的var部门)
{
docs.AddRange(department.DepartmentDocuments.Select(ddoc=>ddoc.Document));
docs.AddRange(department.Functions.SelectMany(fx=>fx.FunctionDocuments,(fx,fdoc)=>fdoc.Document));
}
退货单据;
} 
这可能没问题,该方案使用多个DB调用(如果您使用的是EF而不是Linq to对象)。如果这很糟糕,那么也许你需要在数据库中放一个视图

我不知道如何将其编写为单个linq查询,所以这可能只是进一步工作的起点


这是一个相当简单的后续行动,你的想法。当您希望聚合子数据时,您需要
SelectMany()

LINQ到SQL或实体框架或其他什么?@TimB-LINQ到实体抱歉。LINQ到SQL或实体框架或其他什么?@TimB-LINQ到实体抱歉。非常感谢。我将接受并使用它。你对模型的理解是正确的,我唯一没有的就是“外键”的数据注释。现在就开始解决这个问题。非常感谢你,我会拿着这个来解决它。你对模型的理解是正确的,我唯一没有的就是“外键”的数据注释。现在我们开始努力解决这个问题。
public List<Document> GetDocumentsForDepartment2(List<Department> departments)
{
  var docs = new List<Document>();

  foreach (var department in departments)
  {
    docs.AddRange(department.DepartmentDocuments.Select(ddoc => ddoc.Document));
    docs.AddRange(department.Functions.SelectMany(fx => fx.FunctionDocuments, (fx, fdoc) => fdoc.Document));
  }

  return docs;
}