2013-06-18 39 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

非常感謝你,我會接受並與之合作。你對模型是正確的,我唯一沒有的是「外鍵」的數據註解。現在開始堵塞並解決這個問題。 –