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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值