1

好吧,我什至不知道从哪里开始。我有四个主要的桌子。

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

我有一个IPACS_Documents带有主键的表docID

我有 4 个查找表。

IPACS_DepartmentDocs-> IPACS_FunctionDocs -> IPACS_ProcesseDocs->IPACS_ProcedureDocs

这些表中的每一个都有一个FKIPACS_DocumentdocID 他们也有一个到我在, , ,FK中提到的前四个表。departmentIDfunctionIDprocessIDprocedureID

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

对于我的部门视图页面。我需要显示当前部门中的每一个文件。

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

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

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

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

我希望这是有道理的,因为我的大脑是试图思考这个问题的朋友。

4

1 回答 1

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

这可能没问题,该方案使用多个 DB 调用(如果您使用的是 EF 而不是 Linq to Objects)。如果这很糟糕,那么也许您需要在数据库中放置一个视图。

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

不过,这是对您之前的问题的一个非常简单的后续行动。当您希望聚合子数据时,您需要SelectMany().

于 2013-06-19T00:29:01.677 回答