假设我有两个具有多对一关系的类
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; }
}
当我添加迁移并更新数据库时,结果是两个表:
现在,我要搜索特定父母的所有孩子。在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 表?
答案 0 :(得分:4)
只需使用导航属性即可访问父级PK:
var children = db.Children
.Where(c => c.Parent.Id == parentId)
.ToList();
如果您在Parent
,Where
,OrderBy
(或Select
本身Parent
或{中包含其他Select
实体属性{1}}),当然EF Core将创建一个联接。但是,如果仅访问相关实体的PK,则EF Core足够聪明,可以改用FK并避免加入。
请注意,返回的Include
对象将不会填充Child
属性(将是Parent
),除非上下文尚未使用以下内容跟踪null
实体实例那个PK。