当前位置:首页 > C# > 正文

EF Core包含查询(Include)详解(C#中高效加载关联数据的完整指南)

在使用 Entity Framework Core(EF Core)进行数据库操作时,经常会遇到需要同时获取主表及其关联表数据的场景。例如,查询订单时同时获取客户信息、商品详情等。这时,Include 方法就派上了大用场!本文将从零开始,手把手教你如何在 C# 中使用 EF Core 的 Include 查询来加载关联数据,即使是编程小白也能轻松上手。

什么是 EF Core Include 查询?

Include 是 EF Core 提供的一种预加载(Eager Loading)机制,用于在一次数据库查询中同时加载实体及其关联的导航属性数据。这可以避免“N+1 查询问题”——即先查主表,再为每条记录单独查询关联表,导致大量数据库往返,严重影响性能。

EF Core包含查询(Include)详解(C#中高效加载关联数据的完整指南) Core Include查询  Entity Framework Core关联数据加载 C# Core导航属性 Core预加载性能优化 第1张

准备工作:定义模型和上下文

假设我们要管理一个简单的博客系统,包含 Blog(博客)和 Post(文章)两个实体:

// Blog.cspublic class Blog{    public int Id { get; set; }    public string Name { get; set; } = string.Empty;    // 导航属性:一个博客有多篇文章    public List<Post> Posts { get; set; } = new();}// Post.cspublic class Post{    public int Id { get; set; }    public string Title { get; set; } = string.Empty;    public string Content { get; set; } = string.Empty;    // 外键    public int BlogId { get; set; }    // 导航属性:一篇文章属于一个博客    public Blog Blog { get; set; } = null!;}// ApplicationDbContext.cspublic class ApplicationDbContext : DbContext{    public DbSet<Blog> Blogs { get; set; }    public DbSet<Post> Posts { get; set; }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        optionsBuilder.UseSqlServer("你的连接字符串");    }}

基本用法:使用 Include 加载一对多关系

现在,我们想查询所有博客,并同时加载它们对应的文章列表。只需在查询中调用 Include 即可:

using var context = new ApplicationDbContext();var blogs = context.Blogs    .Include(b => b.Posts) // 加载每个博客的 Posts 导航属性    .ToList();foreach (var blog in blogs){    Console.WriteLine($"博客: {blog.Name}");    foreach (var post in blog.Posts)    {        Console.WriteLine($"  - 文章: {post.Title}");    }}

这样,EF Core 会生成一条包含 JOIN 的 SQL 语句,一次性把博客和文章都查出来,大大提升性能。

进阶技巧:链式 Include 和 ThenInclude

如果关联层级更深,比如 Blog → Posts → Author,可以使用 ThenInclude 继续深入加载:

// 假设 Post 有一个 Author 导航属性var blogs = context.Blogs    .Include(b => b.Posts)        .ThenInclude(p => p.Author)    .ToList();

你也可以多次调用 Include 来加载多个不同的导航属性:

var blogs = context.Blogs    .Include(b => b.Posts)    .Include(b => b.Owner) // 假设 Blog 还有一个 Owner 属性    .ToList();

性能提示与最佳实践

  • 仅在确实需要关联数据时才使用 Include,避免加载不必要的数据。
  • 对于大数据集,考虑分页(Skip/Take)后再使用 Include,防止内存溢出。
  • EF Core 5.0 起支持对 Include 的结果进行过滤(使用 Where),但需注意兼容性。

总结

通过本文,你已经掌握了 EF Core Include 查询 的核心用法,包括基本加载、多级关联以及性能优化建议。合理使用 Include 不仅能简化代码,还能显著提升应用性能。记住,Entity Framework Core 关联数据加载 是开发高效数据驱动应用的关键技能之一。

希望这篇教程能帮助你在 C# 项目中更好地使用 EF Core 导航属性EF Core 预加载性能优化 技术。动手试试吧!