当前位置: 首页 > article >正文

Include多表查询

DeepSeek

在 C# 中,Include 方法通常用于 Entity Framework (EF)Entity Framework Core 中,用于 预先加载相关数据(Eager Loading)。它的主要作用是在查询数据库时,将关联的实体数据一并加载到内存中,避免后续使用时触发额外的数据库查询(即延迟加载,Lazy Loading)。


1. 是什么?

Include 是 EF 和 EF Core 提供的一个方法,用于在查询主实体时,显式加载其关联的导航属性。例如:

  • 查询 Order 时,同时加载与之关联的 OrderDetails
  • 查询 User 时,同时加载与之关联的 Address

2. 为什么?

使用 Include 的主要目的是 优化数据库查询性能,避免 N+1 查询问题

  • N+1 查询问题
    如果不使用 Include,查询主实体后,访问每个实体的导航属性时会触发额外的数据库查询。例如:

    var orders = context.Orders.ToList(); // 1 次查询
    foreach (var order in orders)
    {
         
        var details = order.OrderDetails.ToList(); // N 次查询
    }
    

    这样会导致 1 次主查询 + N 次关联查询,性能较差。

  • 使用 Include 的优化
    通过 Include 预先加载关联数据,可以将主查询和关联查询合并为一次查询,减少数据库访问次数。


3. 怎么做?

基本用法
  1. 单层关联加载
    加载主实体及其直接关联的导航属性:

    using (var context = new MyDbContext())
    {
         
        var orders = context.Orders
            .Include(o => o.OrderDetails) // 加载 OrderDetails
            .ToList();
    }
    
  2. 多层关联加载
    加载多级关联的导航属性,使用 ThenInclude

    using (var context = new MyDbContext())
    {
         
        var orders = context.Orders
            .Include(o => o.OrderDetails) // 加载 OrderDetails
            .ThenInclude(od => od.Product) // 加载 OrderDetails 关联的 Product
            .ToList();
    }
    
  3. 加载多个关联属性
    如果需要加载多个导航属性,可以链式调用 Include

    using (var context = new MyDbContext())
    {
         
        var users = context.Users
            .Include(u => u.Address) // 加载 Address
            .Include(u => u.Orders)  // 加载 Orders
            .ToList()

http://www.kler.cn/a/540689.html

相关文章:

  • gitlab多项目流水线
  • 认识网络安全
  • 安卓开发,底部导航栏
  • 字符串高频算法:无重复字符的最长子串
  • 智能化食品安全管理:AI视频监控在大型商场的技术方案
  • HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)
  • ECG分析0210
  • 软件工程-软件需求规格说明(SRS)
  • 实战设计模式之责任链模式
  • 使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理
  • php 实现 deepSeek聊天对话
  • MacOS安装Milvus向量数据库
  • 【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
  • 蓝桥杯算法日记|贪心、双指针
  • 石英表与机械表的世纪之争(Quartz vs. Mechanical Watches):瑞士钟表业的危机与重生(中英双语)
  • 如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令
  • 目标检测数据集合集(持续更新中)
  • centos docker安装
  • 【C#零基础从入门到精通】(八)——C#String字符串详解
  • 【华为OD-E卷 - 120 分割数组的最大差值 100分(python、java、c++、js、c)】
  • ABP框架9——自定义拦截器的实现与使用
  • 如何使用Socket编程在Python中实现实时聊天应用
  • 笔试-字符串2
  • Web前端开发--HTML
  • java后端开发day10--综合练习(一)
  • 基于“感知–规划–行动”的闭环系统架构