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 左连接的三种查询写法。

相关推荐
摸鱼的春哥5 分钟前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
Victor35621 分钟前
MongoDB(2)MongoDB与传统关系型数据库的主要区别是什么?
后端
JaguarJack22 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo23 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
Victor35624 分钟前
MongoDB(3)什么是文档(Document)?
后端
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate