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;
}