EF LINQ - 如何查询外键关联的2个表?

时间:2016-05-08 17:02:36

标签: c# sql .net entity-framework linq

首先使用EF 6代码。我有一个Entity类和一个Name类,并希望查询所有Entity对象的列表及其各自的Names,以便我可以在Gridview控件上显示。

这些是我的班级定义:

public class Entity
{
    [Key]
    public int EntityKey { get; set; }

    public virtual ICollection<Name> Names { get; set; }      
}

public class Name
{
    [Key]
    public int NameKey { get; set; }
    public int EntityKey { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Entity Entity { get; set; }
}

在我的数据访问层中,我有一个从数据库中获取所有实体的方法:

public List<Entity> GetEntities()
    {
        SdmDBContext entityDbContext = new SdmDBContext();
        return entityDbContext.Entities.ToList();
    }

但是使用此查询,我没有获得与Entity类关联的Name。我已经尝试过LINQ和lambda表达式,以及.Include操作,但不确定如何正确地表达语法。

如何更改DAL方法以返回与所有现有实体关联的名称?

1 个答案:

答案 0 :(得分:3)

您的代码正在加载实体表中的实体列表,并且在“延迟加载”时,它还应该在您访问它们时返回关联的Name集合。您将ICollection声明为虚拟以启用“延迟加载”,因为当您访问尚未急切加载的内容时,将创建代理对象以发出数据库请求。

Include只是通过使用对象上定义的导航属性来急切加载相关实体的请求。您可以使用lambda或字符串来调用Include,该字符串或字符串表示您想要加载的导航属性的名称。

例如:

public List<Entity> GetEntities()
{
    SdmDBContext entityDbContext = new SdmDBContext();
    return entityDbContext.Entities.Include("Names").ToList();
}