EF Core通过相关ID查询数据

时间:2019-01-22 18:24:32

标签: c# entity-framework-core

假设我有两个具有多对一关系的类

public class ParentObject{
    public int Id { get; set; }
    public List<ChildObject> Children { get; set; }
    ...
}

public class ChildObject{
    public int Id { get; set; }
    public ParentObject Parent { get; set; }
}

当我添加迁移并更新数据库时,结果是两个表:

  • ParentObject
    • Id:int
    • ...
  • ChildObject
    • Id:int
    • ParentObjectId:int
    • ...

现在,我要搜索特定父母的所有孩子。在SQL中,只需在 ChildObject.ParentObjectId 列上进行查询,我就不必加入父表即可做到这一点。

SELECT * FROM [ChildObject] c WHERE c.ParentObjectId = parentId

但是在EF Core中,我发现做到这一点的唯一方法是先使用.Include(c => c.Parent)然后使用.FirstOrDefault(c => c.Parent.Id == parentId)。这将创建 ParentObject 表的联接。

是否可以在没有.Include()的情况下查询 ChildObject 表?

1 个答案:

答案 0 :(得分:4)

只需使用导航属性即可访问父级PK:

var children = db.Children
    .Where(c => c.Parent.Id == parentId)
    .ToList();

如果您在ParentWhereOrderBy(或Select本身Parent或{中包含其他Select实体属性{1}}),当然EF Core将创建一个联接。但是,如果仅访问相关实体的PK,则EF Core足够聪明,可以改用FK并避免加入。

请注意,返回的Include对象将不会填充Child属性(将是Parent),除非上下文尚未使用以下内容跟踪null实体实例那个PK。