在分层SQL数据库中查找所有父项

时间:2016-01-05 04:31:14

标签: c# sql entity-framework linq

使用ASP.NET 4.5和EF 6,我整理了一个如下所示的多级数据模型:

组织,其ICollection为:

_____ 工作区,其ICollection为:

__________ 项目,其ICollection为:

_______________的

如果我有卡ID,我如何在其上方找到父母?我甚至无法弄清楚如何获得一个级别的父母。要找到ID为myCardId的ID的父项目,我想写下这样的内容:

var project = db.Projects.Where(p => p.Cards.Where(c => c.Id == myCardId));

任何指导?你可以指点我的好教程吗?

更新:这是我的项目模型:

public class Project
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime Created { get; set; }

    public virtual ICollection<Card> Cards { get; set; }   
}

这是我的卡片:

public class Card
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime Created { get; set; }
    public string Notes { get; set; }          
}

当我查看数据库中的表时,该卡有一个Project_Id列,但这实际上是来自Entity Framework所做的事情 - 我相信。因为Card模型上没有Parent对象,所以我无法以编程方式询问Card.Project.Workspace.Organization ......

我是否将整个事情落后了?

3 个答案:

答案 0 :(得分:2)

希望你有每个表的参考。

所以你可以通过。

var organization = (from o in Organization
                    from w in Workspaces
                    from p in Projects
                    from c in Cards
                    where c.Id == myCardId && p.projectid == c.projectid && w.workspaceid == p.workspaceid && o.organizationid == w.organizationid select o).FirstOrDefault();

如果它与您的代码不同,请在此处发布您的收藏结构,以便任何人都可以提供帮助。

答案 1 :(得分:1)

我想,找到父母意味着进入层次结构,所以你应该能够写出类似的东西 &#39; var project = db.Projects.Where(p =&gt; p.Cards.Where(c =&gt; c.Id == myCardId));&#39;

var t= db.Cards.where(x=> x.id==myCardId).Select(y=> y.Project.Workspace.Organization);

//这应该返回组织

答案 2 :(得分:1)

你的模型应该是这样的:

public class Project
{
  public int projectId { get; set; }
  public int workspaceId { get; set; }
  public string Title { get; set; }
  public string Description { get; set; }
  public DateTime Created { get; set; }
  public virtual ICollection<Card> Cards { get; set; }   
}

public class Card
{
  public int cardId { get; set; }
  public int projectId { get; set; }
  public string Title { get; set; }
  public DateTime Created { get; set; }
  public string Notes { get; set; }          
}

您的Card表应该引用projectid,而project表应该引用workspaceid,而workspace表应该引用organisationid。

然后您可以使用karthikb2win的查询来获取组织或任何父表。