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

相关推荐
holly就是我28 分钟前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
鸿蒙开发30 分钟前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
用户7884773163430 分钟前
小程序后端三选一:云开发、.NET WebAPI、Node,我按客户现状分了三种答案
后端
aiopencode31 分钟前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
智驭未来掌门人35 分钟前
CLion 开发 Qt 项目的优势
后端
EnCi Zheng1 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
Bazingga1 小时前
从一家酒店讲懂Docker
后端
南归北隐1 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
IT_陈寒1 小时前
刚解决一个 Java 并发问题,这坑踩得我怀疑人生
前端·人工智能·后端
小兔子2 小时前
Unix domain socket 的四个边界:抽象地址没有权限,SO_PEERCRED 是快照
后端