2013-06-18 85 views
0

好吧,我甚至不知道从哪里开始。我有四张主桌。麻烦的LINQ查询/加入

IPACS_Departments(一对多) - >IPACS_Functions(一对多) - >IPACS_Processes(一对多) - >IPACS_Procedures

我有一个IPACS_Documents表具有用于docID主键。

我有4个查找表。

IPACS_DepartmentDocs - >IPACS_FunctionDocs - >IPACS_ProcesseDocs - >IPACS_ProcedureDocs

每个这些表的有FKIPACS_DocumentdocID 他们也有一个FK我的前四个上departmentID提到functionIDprocessIDprocedureID表, 。

我需要以某种方式将这些通过LINQ语句连接在一起。

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

例如我们有一个电脑部门。这个部门有2个职能部门,在这些职能部门有13个进程,在这些进程中有41个程序。

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

在我的部门页面上,我可以访问departmentID

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

我希望这是有道理的,因为我的大脑是朋友试图通过这个想法。

+0

LINQ到SQL或实体框架或其他? –

+0

@TimB LINQ to Entity抱歉。 –

回答

1

我不知道如果我有你的模型降权,但我认为它遵循这种模式(假设实体框架,具有映射属性的后裔实体,以允许走过的层次结构):

public class Department 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual ICollection<Function> Functions { get; set; } 

    public virtual ICollection<DepartmentDocument> DepartmentDocuments { get; set; } 
} 

public class DepartmentDocument 
{ 
    [Key] 
    public int Id { get; set; } 

    [ForeignKey("Department")] 
    public int DeptId { get; set; } 

    [ForeignKey("Document")] 
    public int DocId { get; set; } 

    public virtual Department Department { get; set; } 

    public virtual Document Document { get; set; } 
} 

public class Document 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual DepartmentDocument DepartmentDocument { get; set; } 

    public virtual FunctionDocument FunctionDocument { get; set; } 
} 

假设这样一种模式,那么你可以编写如下 - 我只穿过包括两个层面,但群众演员只是需要一些额外的线路与SelectMany()的子元素:

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

    foreach (var department in departments) 
    { 
    foreach (var ddoc in department.DepartmentDocuments) 
    { 
     docs.Add(ddoc.Document); 
    } 

    foreach (var fx in department.Functions) 
    { 
     foreach (var fdoc in fx.FunctionDocuments) 
     { 
     docs.Add(fdoc.Document); 
     } 
    } 
    } 

    return docs; 
} 

这简化为:

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

这可能是好的,该方案使用多个数据库调用(如果您使用EF而不是Linq到对象)。如果这很糟糕,那么也许你需要在数据库中放置一个视图。

我想不出如何将它写成单个linq查询,所以也许这只是进一步工作的一个起点。

虽然这是您的earlier question的一个非常简单的后续行动。当您想要汇总子数据时,您需要SelectMany()

+0

非常感谢你,我会接受并与之合作。你对模型是正确的,我唯一没有的是“外键”的数据注解。现在开始堵塞并解决这个问题。 –