EF Core 开发实践:Left Join 查询的多种实现方式

本文记录了使用 efcore 中多种左连接查询的写法。

场景示例

  • 订单表:Order
  • 订单明细表:OrderItem,可以为空
csharp 复制代码
public class Order
{
    public int Id { get; set; }
    public string OrderNo { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public string ProductName { get; set; }
}

一、LINQ 查询语法

csharp 复制代码
var query =
    from o in context.Orders
    join oi in context.OrderItems on o.Id equals oi.OrderId
        into items
    from oi in items.DefaultIfEmpty()
    select new
    {
        o.OrderNo,
        ProductName = oi != null ? oi.ProductName : null
    };

二、Linq方法语法(GroupJoin + SelectMandy)

csharp 复制代码
var query = context.Orders
    .GroupJoin(
        context.OrderItems,
        o => o.Id,
        oi => oi.OrderId,
        (o, items) => new { o, items }
    )
    .SelectMany(
        x => x.items.DefaultIfEmpty(),
        (x, oi) => new
        {
            x.o.OrderNo,
            ProductName = oi != null ? oi.ProductName : null
        }
    );

三、导航属性

模型已配置导航属性:

csharp 复制代码
public class Order
{
    public int Id { get; set; }
    public string OrderNo { get; set; }
    
    public ICollection<OrderItem> OrderItems { get; set; }
}

查询写法:

csharp 复制代码
var query = context.Orders.Select(o => new
{
    o.OrderNo,
    o.OrderItems
});

以上就是 ef core 左连接的三种查询写法。

相关推荐
ZDQNFU18 分钟前
ORM之SQLAlchemy教程
后端·python
Assby19 分钟前
为什么我不建议你在 MySQL 里写 `IN (超过1000个ID)`?从 AST 解析到存储引擎的深度拆解
后端·面试
用户409666013175120 分钟前
从 MyBatis 到 JPA:一个 CRUD 程序员的认知重建
后端
llwszx42 分钟前
【Java/Go后端手撸原生Agent(第五篇):多工具并行调用 + BashTool执行引擎 + Judge证据链升级】
java·后端·golang·状态机·pydantic·agnet·llm-as-judge
霸道流氓气质1 小时前
基于 Spring 事务同步机制的事务后置动作收集器 Starter 实践
java·后端·spring
IT_陈寒1 小时前
Java线程池踩了个坑,任务居然默默消失了
前端·人工智能·后端
b130538100492 小时前
HarmonyOS开发实战:小分享-ForEach循环渲染与key生成策略
后端
程序员爱钓鱼2 小时前
配置 GoLand 与 VS Code 开发环境
前端·后端·go
程序员爱钓鱼2 小时前
Rust Vec 动态数组详解:创建、增删、遍历与排序
前端·后端·rust
超人不会飞_Jay2 小时前
Go课程2
开发语言·后端·golang