2013-06-18 4 views
0

좋아, 어디서부터 시작해야할지 모르겠다. 네 개의 주 테이블이 있습니다.Troublesome LINQ 질의/가입

IPACS_Departments (일대) ->IPACS_Functions (일대) ->IPACS_Processes (일대) ->IPACS_Procedures

나는 docID에 대한 기본 키를 가진 IPACS_Documents 테이블이 있습니다.

4 개의 룩업 테이블이 있습니다.

IPACS_DepartmentDocs ->IPACS_FunctionDocs ->IPACS_ProcesseDocs ->IPACS_ProcedureDocs

해당 테이블의 각이 docID 그들은 또한 departmentID에 언급 한 첫 네 개의 테이블, functionID, processID, procedureIDFKFKIPACS_Document 테이블에 .

어떻게 든 LINQ 문을 통해 이들을 연결해야합니다.

내 부서보기 페이지 용 현재 부서에있는 모든 단일 문서를 보여줘야합니다.

예를 들어 컴퓨터 부서가 있습니다. 그 부서에는 2 개의 기능이 있으며, 그 기능에는 13 개의 프로세스가 있고 그 프로세스에는 41 개의 프로 시저가 있습니다.

내 부서보기 페이지에서 해당 부서의 모든 문서를 표시해야하며 해당 부서의 기능과 프로세스 및 절차입니다.

내 부서보기 페이지에서 departmentID에 액세스 할 수 있습니다.

나는이 9 개의 다른 테이블을 사용하여 모든 관련 문서를 얻는 방법을 100 % 혼동하고 있습니다.

내 뇌가 이것을 통해 생각하려고하는 친구이기 때문에 의미가 있기를 바랍니다.

+0

LINQ to SQL 또는 Entity Framework 또는 다른 것? –

+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; } 
} 
로 단순화

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

: 난 단지 두 개의 레벨을 통과 포함했지만, 엑스트라은 몇 가지 여분의 하위 요소에 대한 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; 
} 

스키마는 하나 이상의 DB 호출을 사용합니다 (EF를 사용하고 객체에 Linq를 사용하지 않는 경우). 그게 낫다면 아마 DB에 뷰를 넣어야 할 것입니다.

나는 이것을 하나의 linq 쿼리로 작성하는 방법을 생각할 수 없었습니다. 아마도 이것은 앞으로의 작업을위한 출발점 일 것입니다.

이것은 매우 간단한 후속 조치 인 earlier question입니다.하위 데이터를 집계하려면 SelectMany()이 필요합니다.

+0

대단히 감사 드리며 함께 작업하겠습니다. 당신은 모델에 맞았고, 내가 가지고 있지 않은 유일한 것은 "외래 키"에 대한 데이터 주석입니다. 이제 연결을 해제하고이 문제를 해결하십시오. –