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

相关推荐
马卡巴卡2 小时前
用Spring的ApplicationEventPublisher进行事件发布和监听
后端
y***n6142 小时前
springboot项目架构
spring boot·后端·架构
无名之辈J2 小时前
生产环境慢 SQL 排查与优化
后端
悟能不能悟2 小时前
jasper里面$F和$P的区别
开发语言·后端
短剑重铸之日2 小时前
《7天学会Redis》Day 3 - 持久化机制深度解析
java·redis·后端·缓存
萧曵 丶3 小时前
Spring 全套高频面试题(由浅到深 完整版)
java·后端·spring
武子康3 小时前
大数据-213 Python 手写 K-Means 聚类实战(鸢尾花 Iris 数据集):从距离函数到迭代收敛与坑点
大数据·后端·机器学习
神奇小汤圆3 小时前
MySQL大事务的Recovery优化
后端
魔术师卡颂3 小时前
提问量暴跌 80% ,Stack Overflow 却赚翻了?
前端·后端·ai编程