本文记录了使用 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 左连接的三种查询写法。