C#中如何使用EF Core的查询包含?加载相关数据?

来源:这里教程网 时间:2026-02-21 17:28:03 作者:

在使用 EF Core 进行数据查询时,经常会遇到需要加载相关联的数据(导航属性)的场景。EF Core 提供了多种方式来“包含”这些关联数据,最常用的是 IncludeThenInclude 方法。下面介绍如何正确使用它们来加载相关数据。

1. 使用 Include 加载直接关联的数据

当你有一个实体包含导航属性(例如,一个博客有多个文章),你可以使用 Include 来显式加载这些关联数据。

示例:

假设你有两个类:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Post> Posts { get; set; }
}
public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

要查询所有博客并包含其文章,可以这样写:

var blogs = context.Blogs
    .Include(b => b.Posts)
    .ToList();

这会生成一条 SQL 查询(或使用 JOIN),将 Blogs 和 Posts 一起加载,避免了 N+1 查询问题。

2. 使用 ThenInclude 加载多级关联数据

如果关联属性还有自己的导航属性,可以使用 ThenInclude 继续向下加载。

示例:

假设 Post 还有一个作者信息:

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
}

修改 Post 类:

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int BlogId { get; set; }
    public int AuthorId { get; set; }
    public Blog Blog { get; set; }
    public Author Author { get; set; }
}

现在你想加载博客、博客的文章,以及每篇文章的作者:

var blogs = context.Blogs
    .Include(b => b.Posts)
        .ThenInclude(p => p.Author)
    .ToList();

这样就能一次性加载三层关联数据。

3. 包含多个独立的关联属性

如果一个实体有多个独立的导航属性,可以多次调用 Include

示例:

比如 Blog 还有一个“管理员”属性:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AdminId { get; set; }
    public Admin Admin { get; set; }
    public List<Post> Posts { get; set; }
}

你可以同时加载 Posts 和 Admin:

var blogs = context.Blogs
    .Include(b => b.Posts)
    .Include(b => b.Admin)
    .ToList();

4. 注意事项与性能建议

使用 Include 时要注意以下几点:

Include 会增加查询的复杂度,可能生成大结果集,只在必要时使用。 避免过度包含无关数据,特别是大数据字段(如文本、图片)。 EF Core 支持字符串形式的 Include(如
.Include("Posts")
),但不推荐,因为缺乏编译时检查。
在 ASP.NET Core 中返回实体前,确保已加载所需数据,避免在视图中触发延迟加载(如果未启用)。

基本上就这些。合理使用 Include 和 ThenInclude,能让你高效地加载关联数据,提升应用性能。

相关推荐