If you’ve ever struggled with verbose LINQ queries when trying to write a LEFT JOIN, you’re not alone. For years, developers had to hack together GroupJoin + SelectMany + DefaultIfEmpty() just to mimic a SQL LEFT JOIN.
But now, with .NET 10 and EF Core 10, Microsoft is finally giving us something we’ve all been waiting for:
👉 First-class LeftJoin and RightJoin LINQ methods.

Let’s dive into what they are, why they matter, how to use them, their requirements, limitations, and real-life examples.
What is LeftJoin in .NET 10?
The new LeftJoin operator in LINQ allows you to directly perform an outer join between two collections or EF Core entities.
It works just like SQL’s LEFT JOIN:
Keep all records from the left source.
Match with the right source records when available.
Fill with
nullwhen no match exists.
No more workarounds. No more boilerplate. Just clean, readable code.
Where Can You Use It?
You’ll use LeftJoin in any scenario where:
You’re working with relational data (e.g., EF Core entities).
You want to preserve data from one side, even if no matches exist on the other.
Common cases include:
Customers & Orders
Employees & Departments
Products & Discounts
When Was It Introduced?
Introduced in: .NET 10 preview & EF Core 10 preview (2025).
Final release expected: November 2025.
This means if you’re testing .NET 10 preview SDK, you can already try it.
Why Is It Important?
Before .NET 10, a Left Join in LINQ looked like this:
var query = context.Students
.GroupJoin(
context.Departments,
s => s.DepartmentID,
d => d.ID,
(s, deptGroup) => new { s, deptGroup }
)
.SelectMany(
x => x.deptGroup.DefaultIfEmpty(),
(x, dept) => new {
StudentName = x.s.FirstName + " " + x.s.LastName,
DepartmentName = dept != null ? dept.Name : "[NONE]"
}
);Messy, right? 👎
Now, with .NET 10’s LeftJoin, it becomes:
var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
dept => dept.ID,
(student, dept) => new {
StudentName = student.FirstName + " " + student.LastName,
DepartmentName = dept?.Name ?? "[NONE]"
}
);Much cleaner
Easier to maintain
Matches SQL more naturally

Join the conversation! Your thoughts help the community grow.